Cod sursa(job #2774562)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 11 septembrie 2021 21:59:39
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>

using namespace std;

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

const int NMAX = 15000;

int aint[NMAX * 4 + 2];
int v[NMAX + 2];

void build(int node, int from, int to){
  if( from == to ) {
    aint[node] = v[from];
    return ;
  }
  int med = (from + to) >> 1;
  build(2 * node, from, med);
  build(2 * node + 1, med + 1, to);
  aint[node] = aint[2 * node] + aint[2 * node + 1];
}

void update(int node, int from, int to, int x, int val){
  if( from == to ) {
    aint[node] -= val;
    return ;
  }

  int med = (from + to) >> 1;
  if( med <= x )
    update(2 * node, from, med, x, val);
  else
    update(2 * node + 1, med + 1, to, x, val);
  aint[node] = aint[2 * node] + aint[2 * node + 1];
}

int query(int node, int from, int to, int x, int y){
  if( from == x && y == to )
    return aint[node];

  int med = (from + to) >> 1;
  if( y <= med )
    return query(2 * node, from, med, x, y);
  else if( x > med )
    return query(2 * node + 1, med + 1, to, x, y);
  else
    return (query(2 * node, from, med, x, med) + query(2 * node + 1, med + 1, to, med + 1, y));
}

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