Cod sursa(job #2001111)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 15 iulie 2017 18:06:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int DIM = 15001;
int a,b,t,i,v[DIM],aint[4*DIM],n,q;
void build( int nod, int st , int dr ){
    if( st == dr ){
        aint[nod] = v[st];
        return;
    }
    int mid = ( st + dr )/2;
    build( nod*2,st,mid );
    build( nod*2+1,mid+1,dr);
    aint[nod] = aint[nod*2] + aint[nod*2+1];
    return;
}
void update( int nod, int st, int dr, int x, int p ){
    if( dr < p || st > p ){
        return;
    }
    if( st == dr ){
        aint[nod] -= x;
        return;
    }
    int mid = ( st + dr )/2;
    update( nod*2,st,mid,x,p);
    update( nod*2+1,mid+1,dr,x,p);
    aint[nod] = aint[nod*2] + aint[nod*2+1];
}
int query( int nod, int st, int dr, int x, int y ){
    if( dr < x || st > y ){
        return 0;
    }
    if( x <= st && y >= dr ){
        return aint[nod];
    }
    int mid = ( st + dr )/2;
    int stanga = query( nod*2,st,mid,x,y );
    int dreapta = query( nod*2+1, mid+1,dr,x,y );
    return stanga + dreapta;

}
int main(){
    in >> n >> q;
    for( i = 1; i <= n; i ++ ){
        in >> v[i];
    }
    build( 1,1,n);
    for( i = 1; i <= q; i ++ ){
        in >> t >> a >> b;
        if( t == 1 ){
            out<<query(1,1,n,a,b)<<"\n";
        }
        if( t == 0 ){
            update( 1,1,n,b,a);
        }
    }
    return 0;
}