Cod sursa(job #2402650)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 10 aprilie 2019 21:31:00
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <algorithm>
#define NMAX 15000

using namespace std;

int aint[4 * NMAX + 1];

void update( int poz, int val, int st, int dr, int i ) {
  if( st == dr ) {
    aint[i] += val;
    return ;
  }
  else {
    int mid = ( st + dr ) / 2;
    if( poz <= mid )
      update( poz, val, st, mid, i * 2 );
    else
      update( poz, val, mid + 1, dr, i * 2 + 1 );
    aint[i] = aint[i * 2] + aint[i * 2 + 1];
  }
}

int query( int a, int b, int st, int dr, int i ) {
  if( a == st && b == dr )
    return aint[i];
  else {
    int mid = ( st + dr ) / 2;
    if( b <= mid )
      query( a, b, st, mid, i * 2);
    else if( a > mid )
      query( a, b, mid + 1, dr, i * 2 + 1 );
    else
     return (query( a, mid, st, mid, i * 2 ) + query( mid + 1, b, mid + 1, dr, i * 2 + 1 ));
  }
}

int main() {
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");
    int n, m, op, i, a, b;
    fin>>n>>m;
    for( i = 1; i <= n; i ++ ) {
      fin>>a;
      update( i, a, 1, n, 1 );
    }
    for( i = 1; i <= m; i ++ ) {
      fin>>op>>a>>b;
      if( op == 0 )
        update( a, -b, 1, n, 1 );
      else
        fout<<query( a, b, 1, n, 1 )<<"\n";
    }
    return 0;
}