Cod sursa(job #164253)

Utilizator mgntMarius B mgnt Data 23 martie 2008 20:12:56
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
# include <iostream>
# include <fstream>
# include <cstdio>
# 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 ) >> 1 ;
    int nod1 = nod << 1 ;
    int nod2 = 1 + nod1 ;
    if ( poz <= mij ) actualizare ( nod1 , st      , mij ) ;
    if ( poz >  mij ) actualizare ( nod2 , mij + 1 ,  dr ) ;
    suma [ nod ] = suma [ nod1 ] + suma [ nod2 ] ;
  }
}

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 ) >> 1 ;
    int nod1 = nod1 << 1 ;
    int nod2 = nod1 + 1 ;
    int x = 0 , y = 0 ;
    if ( a <= mij ) x = interogare ( nod1 , st      , mij , a , b ) ;
    if ( b >  mij ) y = interogare ( nod2 , mij + 1 ,  dr , a , b ) ;
    return x + y ;
  }
}

int
main ( ) {
  FILE * pFin  = fopen ( "datorii.in" , "r" ) ;
  FILE * pFout = fopen ( "datorii.out" , "w" ) ;
  setvbuf ( pFin , NULL , _IOFBF , 1024 * 1024 ) ;
  setvbuf ( pFout , NULL , _IOFBF , 1024 * 1024 ) ;
  int n , m ;
  fscanf ( pFin , "%d %d" , & n , & m ) ;
  fill ( & suma [ 0 ] , & suma [ sizeof ( suma ) / sizeof ( suma [ 0 ] ) ] , 0 ) ;
  int i ;
  for ( i = 1 ; i <= n ; i ++ ) {
    fscanf ( pFin , "%d", & val ) ; poz = i ;
    actualizare ( 1 , 1 , n ) ;
  }
  for ( i = 1 ; i <= m ; i ++ ) {
    int p , q , r;
    fscanf ( pFin , "%d %d %d" , & r , & p , & q ) ;
    if ( 0 == r ) {
      poz = p ; val = - q ;
      actualizare ( 1 , 1 , n ) ;
    } else {
      int v = interogare ( 1 , 1 , n , p , q ) ;
      fprintf ( pFout , "%d\n" , v ) ;
    }
  }
  fclose ( pFin ) ;
  fclose ( pFout ) ;
  return 0 ;
}