Cod sursa(job #164245)

Utilizator mgntMarius B mgnt Data 23 martie 2008 19:56:41
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
# include <iostream>
# include <fstream>
# include <algorithm>
using namespace std ;

int const maxn = 15000 ;
static int suma [ 3 * maxn ] ;
static int poz , val ;

void
actualizare ( int nod , int st , int dr ) {
  if ( poz <= st && dr <= poz ) {
    suma [ nod ] += val ;
  } else {
    int mij = ( st + dr ) / 2 ;
    if ( poz <= mij ) actualizare ( 2 * nod     , st      , mij ) ;
    if ( poz >  mij ) actualizare ( 2 * nod + 1 , mij + 1 ,  dr ) ;
    suma [ nod ] = suma [ 2 * nod ] + suma [ 2 * nod + 1 ] ;
  }
}

int
interogare ( int nod , int st , int dr , int a , int b ) {
  if ( a <= st && dr <= b ) {
    return suma [ nod ] ;
  } else {
    int mij = ( st + dr ) / 2 ;
    int x = 0 , y = 0 ;
    if ( a <= mij ) x = interogare ( 2 * nod     , st      , mij , a , b ) ;
    if ( b >  mij ) y = interogare ( 2 * nod + 1 , mij + 1 ,  dr , a , b ) ;
    return x + y ;
  }
}

int
main ( ) {
  ifstream sin ( "datorii.in" ) ;
  ofstream sout ( "datorii.out" ) ;
  int n , m ;
  sin >> n >> m ;
  fill ( & suma [ 0 ] , & suma [ sizeof ( suma ) / sizeof ( suma [ 0 ] ) ] , 0 ) ;
  int i ;
  for ( i = 1 ; i <= n ; i ++ ) {
    sin >> val ; poz = i ;
    actualizare ( 1 , 1 , n ) ;
  }
  for ( i = 1 ; i <= m ; i ++ ) {
    int p , q , r;
    sin >> r >> p >> q ;
    if ( 0 == r ) {
      poz = p ; val = - q ;
      actualizare ( 1 , 1 , n ) ;
    } else {
      int v = interogare ( 1 , 1 , n , p , q ) ;
      sout << v << endl ;
    }
  }
  return 0 ;
}