VioletaBabel
2042번: 구간 합 구하기 본문
#include <cstdio>
#define max 2097152 // 2^21
long long sum(int l, int r, int nl, int nr, int nodeNum);
void update(int i, int v);
long long num[max];
int main()
{
int a, b, c, n, m, k, rn;
scanf("%d %d %d", &n, &m, &k);
for (rn = 1; rn < n; rn *= 2);
for (int i = rn - 1; i < rn - 1 + n; scanf("%lld", &num[i++]));
for (int i = rn - 2; i > -1; --i)
num[i] = num[i * 2 + 1] + num[i * 2 + 2];
for (int i = 0; i < m + k; ++i)
{
scanf("%d %d %d", &a, &b, &c);
if (a == 2)
printf("%lld\n", sum(b - 1, c - 1, 0, rn - 1, 0));
else
update(b + rn - 1, c);
}
}
long long sum(int l, int r, int nl, int nr, int nodeNum)
{
if (r < nl || nr < l)
return 0;
if (l <= nl && nr <= r)
return num[nodeNum];
return sum(l, r, nl, (nl + nr) / 2, nodeNum * 2 + 1) + sum(l, r, ((nl + nr) / 2) + 1, nr, nodeNum * 2 + 2);
}
void update(int i, int v)
{
num[i - 1] = v;
for (i /= 2; i > 0; i /= 2)
num[i - 1] = num[2 * i - 1] + num[2 * i];
}
'백준 > 백준-C++' 카테고리의 다른 글
11403번: 경로 찾기 (0) | 2017.06.23 |
---|---|
11404번: 플로이드 (0) | 2017.06.23 |
2869번: 달팽이는 올라가고 싶다 (0) | 2017.06.16 |
1476번: 날짜 계산 (0) | 2017.06.14 |
1722번: 순열의 순서 (실패) (0) | 2017.06.14 |