Cod sursa(job #2058065)

Utilizator CozehNita Horia Teodor Cozeh Data 5 noiembrie 2017 01:09:34
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int v[15002],arbint[150002];

void update(int st, int dr, int pos, int nod, int achit){
    int mij;
    if(st==dr){ v[pos] -= achit; arbint[nod] = v[pos];}
    else{
        mij = (st+dr)/2;
        if(pos <= mij) update(st,mij,pos,nod*2,achit);
        else update(mij+1,dr,pos,nod*2+1,achit);
        arbint[nod] = arbint[nod*2] + arbint[2*nod+1];
    }
}

int interogare(int st, int dr, int A, int B, int nod){
    int mij;
    if(st == A && dr == B) return arbint[nod];
    else{
        mij = (st+dr)/2;
        if(B <= mij) return interogare(st,mij,A,B,2*nod);
        else if(A > mij) return interogare(mij+1,dr,A,B,2*nod+1);
        else return interogare(st,mij,A,mij,2*nod) + interogare(mij+1,dr,mij+1,B,2*nod+1);
    }
}

int main(){

    int N,M,A,B,x;
    fin>>N>>M;
    int i;
    for(i = 1; i <= N; i++){
        fin>>v[i];
        update(1,N,i,1,0);
    }
    for(i = 0; i < M; i++){
        fin>>x>>A>>B;
        if(x == 0){
            update(1,N,A,1,B);
        }
        if(x == 1){
            fout<<interogare(1,N,A,B,1)<<"\n";
        }
    }

}