Cod sursa(job #2757974)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 7 iunie 2021 20:38:32
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

using namespace std;

#define NMAX 100000

ifstream cin ( "aib.in" );
ofstream cout ( "aib.out" );

int aib[NMAX + 1], n;

int suma( int p ) {
    int s = 0;
    while ( p != 0 ) {
      int p2 = ( p & (-p) );
      s += aib[p];
      p -= p2;
    }
    return s;
}
void actualizare( int p, int val ) {
  while ( p <= n ) {
    aib[p] += val;
    int p2 = ( p & (-p) );
    p += p2;
  }
}

int caut( int val ) {
    int p = 0, pas = 1 << 16;
    while ( pas != 0 ) {
      if ( p + pas <= n && aib[p + pas] <= val ) {
        p += pas;
        val -= aib[p];
      }
      pas /= 2;
    }
    if ( p <= n && val == 0 ) return p;
    return -1;
}

int main() {
    int m, i, j, op, a, b;
    cin >> n >> m;
    for ( i = 1; i <= n; i++ ) {
      cin >> j;
      actualizare(i, j);
    }
    for ( i = 1; i <= m; i++ ) {
      cin >> op >> a;
      if ( op == 2 ) {
        cout << caut(a) << "\n";
      }
      else
        cin >> b;
      if ( op == 1 ) {
        cout << suma(b) - suma(a - 1) << "\n";
      }
      else if ( op == 0 ) {
        actualizare(a, b);
      }
    }
    return 0;
}