Cod sursa(job #927607)

Utilizator PatrikStepan Patrik Patrik Data 25 martie 2013 21:35:42
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
    #include<cstdio>
    using namespace std;
    #define MAX 50000
    int N , M , A[MAX] , bit , x , y ;

    void update(int n , int l , int r , int x , int val);
    int query(int n , int l , int r , int a , int b);


    int main()
    {
        freopen("datorii.in" , "r" , stdin );
        freopen("datorii.out" , "w" , stdout );
        scanf("%d%d" , &N , &M );
        for(int i = 1 ; i <= N ; ++i )
        {
            scanf("%d" , &x );
            update(1,1,N,i,-x);
        }
        for(int i = 1 ; i <= M ; ++i )
        {
            scanf("%d%d%d" , &bit ,&x , &y);
            if(!bit)update(1,1,N,x,y);
            else printf("%d\n" , query(1,1,N,x,y));
        }
        return 0;
    }

    void update(int n , int l , int r , int x , int val)
    {
        if(l==r && l==x)
        {
            A[n] -= val;
            return ;
        }
        int m = (l+r)/2;
        if(x <= m)update(2*n,l,m,x,val);
        else update(2*n+1,m+1,r,x,val);
        A[n] = A[2*n]+A[2*n+1];
    }

    int query(int n , int l , int r , int a , int b)
    {
        if(a<=l&&b>=r)return A[n];
        int m = (l+r)/2;
        int sol = 0;
        if(a<=m)sol+=query(2*n,l,m,a,b);
        if(b>m)sol+=query(2*n+1,m+1,r,a,b);
        return sol;
    }