Cod sursa(job #1028017)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 13 noiembrie 2013 15:42:00
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<fstream>
#define maxn 16385
using namespace std;
ifstream in("datorii.in"); ofstream out("datorii.out");
int n,m,x,tip,a,b,c[maxn];
void build(int poz, int val){
    for(int i=poz; i<=maxn; i+= (i & -i))
        c[i]+=x; //
}
void update(int poz, int val){
    for(int i=poz; i<=maxn; i+= (i & -i))
        c[i]-=val; //la update mergem spre dreapta cu i-ul, la query spre stanga (sa ajungem la acel (1,1))
}
void query(int st, int dr){
    int s=0;
    for(int i=dr; i; i-=( i & -i)) //la fel ca la sumele partiale, calculam sum(dr) si sum(st-1) si le facem diferenta
        s+=c[i]; // i & -i e 2 la puterea nr de 0-uri terminale din repr. in baza 2 a lui i (LSB(i))
    for(int i=st-1; i; i-= (i & -i))
        s-=c[i];
    out<<s<<'\n';
}
int main(){
    in>>n>>m;
    for(int i=1;i<=n;++i){
        in>>x;
        if(x) //if (x) ca daca e 0 se cam buleste
            build(i,x); //ziua i are valoarea x, la fel ca toate celalalte din arbore (vezi pag.101)
    }
    for(int i=1;i<=m;++i){
        in>>tip>>a>>b;
        if(!tip)
            update(a,b);
        else
            query(a,b);
    }
    out.close();
    return 0;
}