Cod sursa(job #2786540)

Utilizator TghicaGhica Tudor Tghica Data 21 octombrie 2021 10:00:42
Problema Arbori indexati binar Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>

using namespace std;

int aib[200001], n;

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

int findSum( int dr ) {
    int s = 0;
    while( dr ) {
        s += aib[dr];
        dr -=( dr & (-dr) );
    }
    return s;
}

int query( int st, int dr ) {
    return findSum( dr ) - findSum( st - 1 );
}

int main() {
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int m, i, p, a, b, poz, put, cop, sum, last;
    cin>>n>>m;
    for( i = 1; i <= n; i++ ) {
        cin>>a;
        update( i, a );
    }
    put = 1;
    while( put <= n )
        put *= 2;
    put /= 2;
    cop = put;
    for( i = 1; i <= m; i++ ) {
        cin>>p;
        cin>>a;
        if( p == 0 ) {
            cin>>b;
            update( a, b );
        } else if( p == 1 ) {
            cin>>b;
            cout<<query( a, b )<<"\n";
        } else {
            poz = 0;
            put = cop;
            sum = 0;
            last = -1;
            while( put != 0 ) {
                if( sum + aib[poz|put] <= a ) {
                    poz |= put;
                    sum += aib[poz];
                }
                if( sum == a )
                    last = poz;
                put >>= 1;
            }
            cout<<last<<"\n";
        }
    }
    return 0;
}