본문 바로가기

Algorithm

C++(씨쁠쁠)(cplusplus)-백준(baekjoon)(BaekJoon)코딩 2042번:구간 합 구하기 답

반응형
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
52
53
#include <iostream>
using namespace std;
long long a[1000000], tree[3000000];
int x1, x2, n, m, k;
 
long long init(int node, int start, int end)//초기화 함수
{
    if (start == end)
        return tree[node] = a[start];
    else
        return tree[node] = init(node * 2, start, (start + end) / 2+ init(node * + 1, (start + end) / + 1, end);
}
void update(int node, int start,int end, int i, long long diff)//차이만큼 더해준 정보에 더해줌
{
    if (i<start || i>end)return;
    tree[node] += diff;
    if (start != end)
    {
        update(node * 2, start, (start + end) / 2, i, diff);
        update(node * + 1, (start + end) / + 1, end, i, diff);
    }
}
long long sum(int node, int start, int end, int i, int j)//b,c가 다르면 b부터 c까지 구간을 더해줌
{
    if (i > end || j < start) { return 0; }
    if (i <= start && j >= end) { return tree[node]; }
    return sum(node * 2, start, (start + end) / 2, i, j) + sum(node * + 1, (start + end) / + 1, end, i, j);
}
int main() {
    scanf("%d %d %d"&n, &m, &k);
    for (int i = 0; i < n; i++)
        scanf("%lld",&a[i]);
    init(10, n - 1);
    m += k;
    while (m--)
    {
        scanf("%d"&x1);
        if (x1 == 1)
        {
            long long x3;
            scanf("%d %lld"&x2, &x3);
            long long diff = x3 - a[x2-1];
            a[x2 - 1= x3;
            update(10, n - 1, x2-1, diff);
        }
        else if(x1==2)
        {
            int x3;
            scanf("%d %d"&x2, &x3);
            printf("%lld\n", sum(10, n - 1, x2-1, x3-1));
        }
    }
}
cs