Cod sursa(job #952662)

Utilizator primulDarie Sergiu primul Data 23 mai 2013 19:33:58
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 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;
}