Cod sursa(job #943967)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 26 aprilie 2013 22:11:07
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
using namespace std;
 
#define in "datorii.in"
#define out "datorii.out"
#define NMAX 100001
 
int n, a[NMAX], m;
typedef long long INT;
INT suma, ai[NMAX];
 
FILE *fin = fopen( in, "r" );
FILE *fout = fopen( out, "w" );
 
void Update(int nod, int st, int dr, int poz);
void Querry( int nod, int st, int dr, int a, int b);
 
int main()
{
    fscanf( fin, "%d%d", &n, &m );
    int i;
    for ( i = 1; i <= n; ++i )
    {
          fscanf( fin, "%d", &a[i] );
          Update( 1, 1, n, i);
    }
    int k;
    int s, f;
    INT j;
    for ( j = 1; j <= m; ++j )
    {
          fscanf( fin, "%d%d%d", &k, &s, &f );
          if ( k == 0 )
          {
                a[s] -= f;
                Update( 1, 1, n, s);
          }
          else
          {
               suma = 0;
               Querry( 1, 1, n, s, f );
               fprintf( fout, "%lld\n", suma );
          }
    }
    fclose( fin );
    //fprintf( fout, "Mihai\n" );
    fclose( fout );
    return 0;
}
 
void Update( int nod, int st, int dr, int poz )
{
     if ( st == dr )
     {
          ai[nod] = a[poz];
          return;
     }
     if ( st < dr )
     {
          int mij = (st+dr)>>1;
          if ( poz <= mij ) Update( 2*nod, st, mij, poz );
          if ( poz > mij  ) Update ( 2*nod + 1, mij+1, dr, poz );
     }
     ai[nod] = ai[2*nod] + ai[2*nod+1];
}
 
void Querry( int nod, int st, int dr, int a, int b )
{
     if ( a <= st && b >= dr )
     {
          suma += ai[nod];
          return;
     }
     int mij = ( st+dr ) >> 1;
     if ( a <= mij ) Querry( 2*nod, st, mij, a, b );
     if ( b > mij ) Querry( 2*nod+1, mij+1, dr, a, b );
}