Cod sursa(job #1018052)

Utilizator teoionescuIonescu Teodor teoionescu Data 28 octombrie 2013 20:26:29
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int Nmax = 15002;
int A[15*Nmax];
int v[Nmax];
int N,M;
int Query(int a,int b,int st,int dr,int i){
    if(a<=st && dr<=b) return A[i];
    int mij=(st+dr)/2;
    if(a<=mij && b>mij){
        int left=Query(a,mij,st,mij,2*i);
        int right=Query(mij+1,b,mij+1,dr,2*i+1);
        return left+right;
    }
    if(b<=mij) return Query(a,b,st,mij,2*i);
    else return Query(a,b,mij+1,dr,2*i+1);
}
void Update(int where,int st,int dr,int i){
    if(st==dr) A[i]=v[where];
    else{
        int mij=(st+dr)/2;
        if(where<=mij) Update(where,st,mij,2*i);
        else Update(where,mij+1,dr,2*i+1);
        A[i]=A[2*i]+A[2*i+1];
    }
}
int main(){
    in>>N>>M;
    for(int i=1;i<=N;i++){
        in>>v[i];
        Update(i,1,N,1);
    }
    for(int i=1;i<=M;i++){
        int a,b,c;
        in>>c>>a>>b;
        if(c==0){
            v[a]-=b;
            Update(a,1,N,1);
        }
        if(c==1){
            out<<Query(a,b,1,N,1)<<'\n';
        }
    }
    return 0;
}