Cod sursa(job #1037701)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 20 noiembrie 2013 17:45:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<fstream>
using namespace std;
int arb[45000],a,b,x,y,n,m,t,sol,poz,val,st,dr;
ifstream in("datorii.in"); ofstream out("datorii.out");
void update(int nod, int st, int dr, int poz, int val){
    if(st==dr){
        arb[nod]+=val;
    }
    else{
        int m=(st+dr)/2;
        if(poz<=m) update(nod*2,st,m,poz,val);
        else       update(nod*2+1,m+1,dr,poz,val);
        arb[nod]=arb[nod*2]+arb[nod*2+1];
    }
}
void querry(int nod, int st, int dr){
    if(a<=st && dr<=b){
        sol+=arb[nod]; //daca intervalul curent (st,dr) este inclus in intervalul cautat, se aduna la solutie
        return ;
    }
    int m=(st+dr)/2;
    if(a<=m) querry(nod*2,st,m); //daca are rost sa caut pe fiul stanga a nodului (capatul cautat e mai mic decat capatul unde merg
    if(b>m)  querry(nod*2+1, m+1, dr); //idem
}
int main(){
    //Solutia 2: Arbori de intervale
    in>>n>>m;
    for(int i=1;i<=n;++i){in>>x; update(1,1,n,i,x);}
    for(int i=1;i<=m;++i){
        in>>t;
        if(!t){
            in>>poz>>val;
            update(1,1,n,poz,-val);
        }
        else{
            in>>a>>b;
            sol=0;
            querry(1,1,n);
            out<<sol<<'\n';
        }
    }
    out.close();
    return 0;
}