본문 바로가기
BOJ

2042. 구간 합 구하기

by hyunnwoo 2023. 7. 18.

https://www.acmicpc.net/problem/2042

 

2042번: 구간 합 구하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄

www.acmicpc.net

 

 

티어 : 골드1

 

세그먼트 트리를 이용해서 풀었다.

 

#include<stdio.h>

long long int arr[1000005], seg[4000005];
int n, m, k;

long long int init(int index, int left, int right){
    if(left == right) return seg[index] = arr[left];
    int mid = (left + right) / 2;
    return seg[index] = init(index*2, left, mid) + init(index*2+1, mid+1, right);
}

void update(int index, int left, int right, long long int value, int findIndex){
    if(left <= findIndex && findIndex <= right){
        seg[index] += value;

        if(left == right) return ;
        int mid = (left + right) / 2;
        update(index*2, left, mid, value, findIndex);
        update(index*2+1, mid+1, right, value, findIndex);
    }
}

long long int sum(int index, int left, int right, int start, int end){
    if(start <= left && right <= end) return seg[index];
    if(start > right || end < left) return 0;
    int mid = (left + right) / 2;
    return sum(index*2, left, mid, start, end) + sum(index*2+1, mid+1, right, start, end);
}

int main()
{
    scanf("%d %d %d", &n, &m, &k);
    for(int i=1 ; i<=n ; i++) scanf("%lld", &arr[i]);

    init(1, 1, n);

    for(int i=0 ; i<m+k ; i++){
        long long int a, b ,c;
        scanf("%lld %lld %lld", &a, &b, &c);

        if(a == 1){
            update(1, 1, n, c-arr[b], b);
            arr[b] = c;
        }
        else{
            printf("%lld\n", sum(1, 1, n, b, c));
        }
    }
}

'BOJ' 카테고리의 다른 글

10868. 최솟값  (0) 2023.07.19
8980. 택배  (0) 2023.07.18
1300. K번째 수  (0) 2023.07.18
8983. 사냥꾼  (0) 2023.06.28
2457. 공주님의 정원  (0) 2023.06.26