Cod sursa(job #2456107)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 13 septembrie 2019 18:19:24
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>

using namespace std;

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

int aint[4 * 15000 + 2], v[15000 + 2];
int s;

void build( int nod, int st, int dr ){
  if( st == dr ){
    aint[nod] = v[st];
    return;
  }
  int med = (st + dr) >> 1;
  build( nod * 2, st, med );
  build( nod * 2 + 1, med + 1, dr );
  aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

void update( int nod, int st, int dr, int a, int b ){
  if( st == dr ){
    aint[nod] -= b;
    return;
  }
  int med = (st + dr) >> 1;
  if( a <= med )
    update( nod * 2, st, med, a, b );
  else
    update( nod * 2 + 1, med + 1, dr, a, b );
  aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

void query( int nod, int st, int dr, int a, int b ){
  if( a <= st && dr <= b ){
    s = s + aint[nod];
    return;
  }
  int med = (st + dr) >> 1;
  if( a <= med )
    query( nod * 2, st, med, a, b );
  if( b > med )
    query( nod * 2 + 1, med + 1, dr, a, b );
}

int main() {
    int n, m, x, y, d, i;
    fin >> n >> m;
    for( i = 1; i <= n; ++i )
      fin >> v[i];
    build(1, 1, n);
    for( i = 1; i <= m; ++i ){
      fin >> d >> x >> y;
      s = 0;
      if( d == 0 )
        update( 1, 1, n, x, y );
      else{
        query( 1, 1, n, x, y );
        fout << s << "\n";
      }
    }
    return 0;
}