포스트

2042 구간 합 구하기

2042 구간 합 구하기 해법


세그먼트 트리를 이용하는 문제. 이전에 다루었던 1019 책 페이지 문제보다 조금 더 심화되어 세그먼트 트리의 모든 기능을 다룰 줄 알아야 해결할 수 있는 문제이다.

#include<cstdio>

using namespace std;

long long seg[4000010];
long long tmp[1000010];

long long init(int start,int end,int idx)
{
    if(start == end)
    {
        seg[idx] = tmp[start];
        return seg[idx];
    }
    int mid = (start+end)/2;
    return seg[idx] = init(start,mid,idx*2) + init(mid+1,end,idx*2+1);
}

void change(int start,int end,int idx,int target,long long diff)
{
    if(start>target || end<target) return;
    seg[idx] += diff;
    if(start==end) return;
    int mid = (start+end)/2;
    change(start,mid,idx*2,target,diff);
    change(mid+1,end,idx*2+1,target,diff);
}

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

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

    for(int i=0;i<m+k;i++)
    {
        long long a,b,c;
        scanf("%lld %lld %lld",&a,&b,&c);
        if(a==1)
        {
            change(0,n-1,1,b-1,c-tmp[b-1]);
            tmp[b-1] = c;
        }
        else{
            printf("%lld\n",sum(0,n-1,1,b-1,c-1));
        }
    }
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.