본문 바로가기

Coding/Data Structure

펜윅트리(이진 인덱스트리 : Binary Index Tree)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream>
using namespace std;
typedef long long ll;
int N, M, K;
ll A[1000005], tree[1000005];
void update(int idx, ll diff) {
    while (idx <= N) {
        tree[idx] += diff;
        idx += (idx & -idx);
    }
}
ll sumQ(int idx) {
    ll ans = 0;
    while (idx > 0) {
        ans += tree[idx];
        idx -= (idx & -idx);
    }
    return ans;
}
int main() {
    scanf("%d%d%d"&N, &M, &K);
    for (int i = 1; i <= N; i++) {
        scanf("%lld"&A[i]);
        update(i, A[i]);
    }
    for (int i = 0; i < M + K; i++) {
        ll a;
        scanf("%lld"&a);
        if (a == 1) {
            int b; ll c;
            scanf("%d%lld"&b, &c);
            ll diff = c - A[b];
            A[b] = c;
            update(b, diff);
        }
        else if (a == 2) {
            int b, c;
            scanf("%d%d"&b, &c);
            printf("%lld\n", sumQ(c) - sumQ(b-1));
        }
    }
    return 0;
}
cs


'Coding > Data Structure' 카테고리의 다른 글

유니온파인드(Union Find)  (0) 2019.01.20
세그먼트트리(Segment Tree)  (0) 2019.01.20