Cod sursa(job #2701022)

Utilizator euyoTukanul euyo Data 29 ianuarie 2021 16:35:28
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>

using namespace std;

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

const int MaxN = 15001;

int tree[4 * MaxN];

inline int left( int node ) {
  return (node << 1); 
}
inline int right( int node ) {
  return (node << 1) | 1;
}

int ux, uval;
void update( int node, int l, int r ) {
  int mid = (l + r) >> 1; 
  
  if ( l == r ) {  
    tree[node] -= uval;
	return;
  }
  if ( ux <= mid ) {
    update( left( node ), l, mid );
  } else {
	update( right( node ), mid + 1, r );
  }
  tree[node] = tree[left( node )] + tree[right( node )];
}

int qx, qy;
int query( int node, int l, int r ) {
  int mid = (l + r) >> 1, s = 0;

  if ( qx <= l && r <= qy ) {
	return tree[node];
  }
  if ( qx <= mid ) {
    s += query( left( node ), l, mid );
  }
  if ( qy > mid ) {
	s += query( right( node ), mid + 1, r );
  }
  return s;
}

int main() {
  int n, m, a;

  fin >> n >> m;
  for ( int i = 1; i <= n; ++i ) {
	fin >> a;
	ux = i, uval = -a;
	update( 1, 1, n );
  }
  while ( m-- ) {
	fin >> a;
	if ( a == 0 ) {
      fin >> ux >> uval;
	  update( 1, 1, n );
	} else {
      fin >> qx >> qy;
	  fout << query( 1, 1, n ) << "\n";
	}
  }
  fin.close();
  fout.close();
  return 0; 
}