Cod sursa(job #951996)

Utilizator apopeid14Apopei Daniel apopeid14 Data 22 mai 2013 15:04:13
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 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;
}