Cod sursa(job #2189222)

Utilizator Athena99Anghel Anca Athena99 Data 27 martie 2018 20:50:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>

using namespace std;

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

const int nmax= 15000;
const int pmax= 32768;

int n, m, p2;
int arb[pmax+1];

void arb_build( int x ) {
    if ( x*2<p2 ) {
        arb_build(x*2);
        arb_build(x*2+1);
    }

    arb[x]= arb[x*2]+arb[x*2+1];
}

void arb_update( int x, int y ) {
    arb[p2+y-1]+= x;

    for ( int i= (p2+y-1)/2; i>0; i/= 2 ) {
        arb[i]= arb[i*2]+arb[i*2+1];
    }
}

int arb_query( int x, int l, int r, int a, int b ) {
    if ( r<a || b<l ) {
        return 0;
    } else if ( a<=l && r<=b ) {
        return arb[x];
    } else {
        return arb_query(x*2, l, (l+r)/2, a, b)+arb_query(x*2+1, (l+r)/2+1, r, a, b);
    }
}

int main(  ) {
    fin>>n>>m;
    for ( p2= 1; p2<n; p2*= 2 ) ;
    for ( int i= 1, x; i<=n; ++i ) {
        fin>>x;
        arb[p2+i-1]= x;
    }

    arb_build(1);

    for ( int x, y, z; m>0; --m ) {
        fin>>x>>y>>z;

        if ( x==0 ) {
            arb_update(-z, y);
        } else {
            fout<<arb_query(1, 1, p2, y, z)<<"\n";
        }
    }

    return 0;
}