Cod sursa(job #2279862)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 10 noiembrie 2018 09:57:21
Problema Arbori indexati binar Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>

int n, aib[150005];

using namespace std;

void update( int p, int val ) {
    while(p <= n) {
      aib[p] += val;
      p += p&-p;
    }
}

int query( int p ) {
    int s = 0;
    while( p > 0 ) {
      s = s + aib[p];
      p -= p&-p;
    }
    return s;
}

int cb( int val ) {
    int i, pas;
    pas = 1 << n;
    for( i = 0; pas > 0; pas /= 2 ) {
        if( i + pas <= n && aib[i+pas] <= val ) {
            i += pas;
            val -= aib[i];
            if( val == 0 )
                return i;
        }
    }
    return -1;
}

int main() {
    freopen( "aib.in", "r", stdin );
    freopen( "aib.out", "w", stdout );
    int m, t, a, b, i;
    scanf( "%d%d", &n, &m );
    for( i = 1; i <= n; i ++ ) {
      scanf( "%d", &a );
      update(i,a);
    }
    for( i = 1; i <= m; i ++ )  {
     scanf( "%d", &t );
     if( t == 0 ) {
       scanf( "%d%d", &a, &b );
       update(a,b);
     }
     else
       if( t == 1 ) {
         scanf( "%d%d", &a, &b );
         printf( "%d\n", query(b) - query(a-1) );
       }
       else {
         scanf( "%d", &a );
         printf( "%d\n", cb(a) );
       }
    }
    return 0;
}