Cod sursa(job #2309125)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 28 decembrie 2018 14:52:17
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>

using namespace std;

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

const int NMAX = 15002;

int N, Q;
int tree[ 2 * NMAX ];

void Update( int nod, int lf, int rg, int pos, int val )
{
  if( lf == rg )
  {
    tree[nod] += val;
    return;
  }

  int mid = ( lf + rg ) / 2;

  if( pos <= mid ) Update( nod * 2, lf, mid, pos, val );
  else Update( nod * 2 + 1, mid + 1, rg, pos, val );

  tree[nod] = tree[nod * 2] + tree[nod * 2 + 1];
}

int Query( int nod, int lf, int rg, int L, int R )
{
  if( L <= lf && rg <= R ) return tree[nod];

  int mid = ( lf + rg ) / 2;
  int ans = 0;

  if( L <= mid ) ans += Query( nod * 2, lf, mid, L, R );
  if( R > mid ) ans += Query( nod * 2 + 1, mid + 1, rg, L, R );

  return ans;
}

int Read()
{
  fin >> N >> Q;

  int aux;

  for( int i = 1; i <= N; ++i )
  {
    fin >> aux;

    Update( 1, 1, N, i, aux );
  }
}

void Do()
{
  int tip, a, b;

  for( int i = 1; i <= Q; ++i )
  {
    fin >> tip >> a >> b;

    if( tip == 0 ) Update( 1, 1, N, a, -b );
    else fout << Query( 1, 1, N, a, b ) << '\n';
  }

  fin.close();
  fout.close();
}

int main()
{
    Read();
    Do();

    return 0;
}