본문 바로가기

Coding/Data Structure

세그먼트트리(Segment 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
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
int n, m, k, a, segSize = 1;
vector<ll> seg;
ll b, c;
 
void update(int idx, ll val) {
    idx += segSize;
    seg[idx] = val;
    while (idx > 1) {
        idx /= 2;
        seg[idx] = seg[idx * 2+ seg[idx * 2 + 1];
    }
}
 
ll partSum(int L, int R, int nodeIdx, int nodeL, int nodeR) {
    if (nodeR < L || R < nodeL) return 0;
    if (L <= nodeL && nodeR <= R) return seg[nodeIdx];
    int mid = (nodeL + nodeR) / 2;
    return partSum(L, R, nodeIdx * 2, nodeL, mid) + partSum(L, R, nodeIdx * 2 + 1, mid + 1, nodeR);
}
 
int main() {
 
    scanf("%d %d %d"&n, &m, &k);
    while (segSize < n) segSize *= 2;
    seg.resize(segSize * 2);
    for (int i = 0; i < n; i++scanf("%lld"&seg[i + segSize]);
    for (int i = 0; i < n; i++)
        update(i, seg[i + segSize]);
    for (int i = 0; i < m + k; i++) {
        scanf("%d %lld %lld"&a, &b, &c);
        if (a == 1) update(b - 1, c);
        else if (a == 2printf("%lld\n", partSum(b - 1, c - 110, segSize - 1));
    }
    return 0;
}
cs


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

유니온파인드(Union Find)  (0) 2019.01.20
펜윅트리(이진 인덱스트리 : Binary Index Tree)  (0) 2019.01.20