Cod sursa(job #946133)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 3 mai 2013 21:10:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>

using namespace std;

#define Nmax 15005

int Arb[ 4 * Nmax ];
int V[ Nmax ];

int N, M;

void Build( int nod, int left, int right ){

    if ( left == right ){

        Arb[nod] = V[left];

        return ;
    }

    int middle = ( left + right ) / 2;

    Build( 2 * nod, left, middle );
    Build( 2 * nod + 1, middle + 1, right );

    Arb[nod] = Arb[ 2 * nod ] + Arb[ 2 * nod + 1 ];
}

void Update( int nod, int left, int right, int pos, int val ){

    if ( left == right ){

        Arb[nod] -= val;

        return ;
    }

    int middle = ( left + right ) / 2;

    if ( pos <= middle )
        Update ( 2 * nod, left, middle, pos, val );
    else
        Update ( 2 * nod + 1, middle + 1, right, pos, val );

    Arb[nod] = Arb[ 2 * nod ] + Arb[ 2 * nod + 1 ];
}

int Query( int nod, int left, int right, int a, int b ){

    if ( a <= left && right <= b )
        return Arb[nod];

    int middle = ( left + right ) / 2;

    int S = 0;

    if ( a <= middle )
        S = Query ( 2 * nod, left, middle, a, b );

    if ( b > middle )
        S += Query ( 2 * nod + 1, middle + 1, right, a, b );

    return S;
}

int main(){

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

    f >> N >> M;

    for ( int i = 1; i <= N; ++i )
        f >> V[i];

    Build( 1, 1, N );

    for ( int x, a, b; M; M-- ){

        f >> x >> a >> b;

        if ( !x )
            Update ( 1, 1, N, a, b );
        else
            g << Query ( 1, 1, N, a, b ) << '\n';
    }

    f.close();
    g.close();

    return 0;
}