Cod sursa(job #3145275)

Utilizator Ana_22Ana Petcu Ana_22 Data 14 august 2023 15:07:52
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <stdio.h>
#define NMAX 15000

using namespace std;

int v[NMAX];
int aint[2*NMAX];

inline int mid( int l, int r ) { return ( l + r ) / 2; }
inline int leftSon( int node ) { return node + 1; }
inline int rightSon( int node, int m, int l ) { return node + 2 * ( m - l + 1 ); }

void build( int node, int l, int r ) {
  if( l == r ) {
    aint[node] = v[l];
    return;
  }

  int m = mid( l, r );
  int lson = leftSon( node );
  int rson = rightSon( node, m, l );

  build( lson, l, m );
  build( rson, m + 1, r );

  aint[node] = aint[lson] + aint[rson];
}

void update( int node, int l, int r, int pos, int val ) {
  if( l == r ) {
    aint[node] -= val;
    return;
  }

  int m = mid( l, r );
  int lson = leftSon( node );
  int rson = rightSon( node, m, l );

  if( pos <= m )
    update( lson, l, m, pos, val );
  else
    update( rson, m + 1, r, pos, val );

  aint[node] = aint[lson] + aint[rson];

}

int query( int node, int l, int r, int a, int b ) {
  if( a <= l && r <= b )
    return aint[node];

  int m = mid( l, r );
  int lson = leftSon( node );
  int rson = rightSon( node, m, l );

  int res = 0;
  if( a <= m )
    res += query( lson, l, m, a, b );
  if( m < b )
    res += query( rson, m + 1, r, a, b );
  return res;

}

int main() {
    FILE *fin, *fout;
    int n, m, type, i, t, val, p, q;
    fin = fopen( "datorii.in", "r" );
    fout = fopen( "datorii.out", "w" );
    fscanf( fin, "%d%d", &n, &m );
    for( i = 0; i < n; i++ )
      fscanf( fin, "%d", &v[i] );
    build( 0, 0, n - 1 );
    for( ; m; m-- ) {
      fscanf( fin, "%d", &type );
      if( type == 0 ) {
        fscanf( fin, "%d%d", &t, &val );
        t--;
        update( 0, 0, n - 1, t, val );
      }
      else {
        fscanf( fin, "%d%d", &p, &q );
        p--, q--;
        fprintf( fout, "%d\n", query( 0, 0, n - 1, p, q ) );
      }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}