알고리즘/알고리즘 문제
                
              [백준] 2042. 구간 합 구하기
                charminseok
                 2020. 9. 6. 19:37
              
                          
            세그먼트 트리 활용
| 
 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 
44 
45 
46 
47 
48 
49 
50 
51 
 | 
 def seg_tree(nums, oper, b, c, tree): 
    def init(start, end, node, a, tree): 
        if start == end:  
            tree[node] = a[start] 
            return tree[node] 
        mid = (start+end)//2 
        tree[node] = init(start, mid, node*2, a, tree) + init(mid + 1, end, node * 2 + 1, a, tree) 
        return tree[node] 
    def sum(start,end,node,left,right, tree): 
        if left > end or right < start: return 0 
        if left <= start and end <= right: return tree[node] 
        mid = (start+end)//2 
        return sum(start, mid, node*2, left, right, tree) + sum(mid + 1, end, node*2+1, left, right, tree) 
    def update(start, end, node, index, dif, tree, a): 
        if index < start or index > end: return 
        if start == end: 
            tree[node] = dif 
            a[index] = dif 
            return 
        tree[node] += dif - a[index] 
        mid = (start+end) // 2 
        update(start,mid, node*2,index, dif, tree, a) 
        update(mid + 1, end, node*2 + 1,index, dif, tree, a) 
    S = 0 
    if oper == 0: 
        init(0, len(nums) - 1, 1, nums, tree) 
    elif oper == 1: 
        update(0, len(nums) - 1, 1, b-1, c, tree, nums) 
    else: 
        S = sum(0, len(nums)-1,1,b-1,c-1,tree) 
    return S 
def sol(): 
    n,m,k = map(int,input().split(' ')) 
    num_list = [] 
    for _ in range(n): 
        num_list.append(int(input())) 
    tree = [0]*4*len(num_list) 
    seg_tree(num_list, 0,0,0, tree) 
    for i in range(m+k): 
        a,b,c=map(int,input().split(' ')) 
        S = seg_tree(num_list,a,b,c, tree) 
        if S != 0: 
            print(S) 
sol() 
 | 
cs |