Cod sursa(job #1144317)

Utilizator lilian_ciobanuLilian Ciobanu lilian_ciobanu Data 16 martie 2014 21:46:48
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<fstream>
#include<algorithm>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

int a[60009],t[15009],n;

void mk_arb(int p, int s, int d){
    if(s==d){
        a[p]=t[s];
    }
    else{
        int m=(s+d)>>1;
        mk_arb((p<<1), s, m);
        mk_arb(((p<<1) + 1), m+1, d);
        a[p]=a[p<<1] + a[(p<<1) + 1];
    }
}

int vl_arb(int p, int l, int r, int s, int d){
    if(s > d){
        return 0;
    }
    else{
        if(l==s && d==r)
            return a[p];
        else{
            int m=(l+r)>>1;
            return vl_arb(p<<1, l , m, s, min(m,d)) + vl_arb(((p<<1) +1), m+1, r, max(s,m+1), d);
        }
    }
}

void svl_arb(int x, int v){
        int p=1,s=1,d=n,m;

    while(s!=d){
        m=(s+d)/2;
        a[p]-=v;
        if(x<=m){
            d=m;
            p<<=1;
        }
        else{
            s=m+1;
            p<<=1;
            p++;
        }
    }
    a[p]-=v;
}


int main(){
    int m,i,b,p,q;

    f>>n>>m;
    for(i=1; i<=n; ++i)
        f>>t[i];

    mk_arb(1,1,n);

    for(i=1; i<=m; ++i){
        f>>b>>p>>q;
        if(b){
            g<<vl_arb(1,1,n,p,q)<<"\n";
        }
        else{
            svl_arb(p,q);
        }
    }

return 0;
}