๋ฌธ์
์ด๋ค N๊ฐ์ ์๊ฐ ์ฃผ์ด์ ธ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ค๊ฐ์ ์์ ๋ณ๊ฒฝ์ด ๋น๋ฒํ ์ผ์ด๋๊ณ ๊ทธ ์ค๊ฐ์ ์ด๋ค ๋ถ๋ถ์ ํฉ์ ๊ตฌํ๋ ค ํ๋ค. ๋ง์ฝ์ 1,2,3,4,5 ๋ผ๋ ์๊ฐ ์๊ณ , 3๋ฒ์งธ ์๋ฅผ 6์ผ๋ก ๋ฐ๊พธ๊ณ 2๋ฒ์งธ๋ถํฐ 5๋ฒ์งธ๊น์ง ํฉ์ ๊ตฌํ๋ผ๊ณ ํ๋ค๋ฉด 17์ ์ถ๋ ฅํ๋ฉด ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ํ์์ ๋ค์ฏ ๋ฒ์งธ ์๋ฅผ 2๋ก ๋ฐ๊พธ๊ณ 3๋ฒ์งธ๋ถํฐ 5๋ฒ์งธ๊น์ง ํฉ์ ๊ตฌํ๋ผ๊ณ ํ๋ค๋ฉด 12๊ฐ ๋ ๊ฒ์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(1 ≤ N ≤ 1,000,000)๊ณผ M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) ๊ฐ ์ฃผ์ด์ง๋ค. M์ ์์ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ ํ์์ด๊ณ , K๋ ๊ตฌ๊ฐ์ ํฉ์ ๊ตฌํ๋ ํ์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋์งธ ์ค๋ถํฐ N+1๋ฒ์งธ ์ค๊น์ง N๊ฐ์ ์๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ N+2๋ฒ์งธ ์ค๋ถํฐ N+M+K+1๋ฒ์งธ ์ค๊น์ง ์ธ ๊ฐ์ ์ ์ a, b, c๊ฐ ์ฃผ์ด์ง๋๋ฐ, a๊ฐ 1์ธ ๊ฒฝ์ฐ b(1 ≤ b ≤ N)๋ฒ์งธ ์๋ฅผ c๋ก ๋ฐ๊พธ๊ณ a๊ฐ 2์ธ ๊ฒฝ์ฐ์๋ b(1 ≤ b ≤ N)๋ฒ์งธ ์๋ถํฐ c(b ≤ c ≤ N)๋ฒ์งธ ์๊น์ง์ ํฉ์ ๊ตฌํ์ฌ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๋ชจ๋ ์๋ -263๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 263-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ K์ค์ ๊ฑธ์ณ ๊ตฌํ ๊ตฌ๊ฐ์ ํฉ์ ์ถ๋ ฅํ๋ค. ๋จ, ์ ๋ต์ -263๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 263-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
ํ์ด
์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ์ฒซ ๋ฌธ์ ..!
์ข ๋ ํธํ๊ฒ ์ดํดํ๊ธฐ ์ํด ์ฌ๊ท ์์ด ๋ฐ๋ณต๋ฌธ์ผ๋ก ํจ์๋ค์ ๊ตฌํํ๋ค.
updateSegment : ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ๋ค (์ด๊ธฐ ๋ฐฐ์ด ์ค์ , a=1 -> ๊ฐ ๋ณ๊ฒฝ)
getSum : ๋ถ๋ถํฉ์ ๊ตฌํ๋ค (a=2 -> b๋ถํฐ c๊น์ง ํฉ ๊ตฌํ๊ธฐ)
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
ll n,m,k;
vector<ll>segment;
// b๋ฒ์งธ ์๋ฅผ c๋ก ๋ฐ๊พผ๋ค
void updateSegment(ll b, ll c) {
ll idx = b + n;
segment[idx] = c;
while(idx!=1) {
idx /= 2;
segment[idx] = segment[idx*2] + segment[idx*2 + 1];
}
}
// b๋ถํฐ c๊น์ง์ ๊ตฌ๊ฐํฉ
ll getSum(ll b, ll c) {
ll left = b + n;
ll right = c + n;
ll sum = 0;
while(left <= right) {
if(left%2 == 1) {
sum += segment[left];
left++;
}
left = left/2;
if(right%2 == 0) {
sum += segment[right];
right--;
}
right = right/2;
}
return sum;
}
int main() {
ios_base::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
ll a,b,c;
cin >> n >> m >> k;
// ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ์ ์
int origin = n;
n = pow(2, floor(log2(4*n))-1);
segment.assign(n*2, 0);
for(ll i=0; i<origin; i++) {
cin >> c;
updateSegment(i, c);
}
for(ll i=0; i<m+k; i++) {
cin >> a >> b >> c;
if(a==1) { // update tree
updateSegment(b-1, c);
} else if(a==2) { // get sum
cout << getSum(b-1, c-1) << "\n";
}
}
return 0;
}