Cod sursa(job #681)

Utilizator TabaraTabara Mihai Tabara Data 11 decembrie 2006 18:42:13
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
using namespace std;

#define in "datorii.in"
#define out "datorii.out"
#define NMAX 70001

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, "%ld%ld", &n, &m );
    int i;
    for ( i = 1; i <= n; ++i )
    {
          fscanf( fin, "%ld", &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 );
}