Cod sursa(job #1264367)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 15 noiembrie 2014 19:12:18
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>

using namespace std;

ifstream fin( "aib.in" );
ofstream fout( "aib.out" );

const int nmax = 100000;
int n, aib[ nmax + 1 ];

inline int lsb( int x ) {
    return ( x & -x );
}
void update( int pos, int val ) {
    for( int i = pos; i <= n; i += lsb( i ) ) {
        aib[ i ] += val;
    }
}
int query1( int pos ) {
    int ans = 0;
    for( int i = pos; i > 0; i -= lsb( i ) ) {
        ans += aib[ i ];
    }
    return ans;
}
int query2( int k ) {
    int sol, sc;
    sol = sc = 0;
    for( int step = 1 << 17; step > 0; step >>= 1 ) {
        if ( sol + step <= n && sc + aib[ sol + step ] <= k ) {
            sol += step;
            sc += aib[ sol ];
        }
    }
    if ( sc != k || sol == 0 ) {
        return -1;
    }
    return sol;
}
int main() {
    int m, x, y, t;
    fin >> n >> m;
    for( int i = 1; i <= n; ++ i ) {
        fin >> x;
        update( i, x );
    }
    while ( m -- ) {
        fin >> t >> x;
        if ( t < 2 ) {
            fin >> y;
            if ( t == 0 ) {
                update( x, y );
            } else {
                fout << query1( y ) - query1( x - 1 ) << "\n";
            }
        } else {
            fout << query2( x ) << "\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}