Cod sursa(job #1264190)

Utilizator felixiPuscasu Felix felixi Data 15 noiembrie 2014 16:29:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int aib[NMAX+2];
int N,Q;

inline int LSB( int nr ) {
    return ( nr & (-nr) );
}

void Update_aib( int poz, int val ) {
    for( int i= poz;  i<=N;  i+= LSB(i) ) {
        aib[i]+= val;
    }
}

int Querry_aib( int poz ) {
    int ans= 0;
    for( int i= poz;  i>0;  i-= LSB(i) ) {
        ans+= aib[i];
    }
    return ans;
}

int Bin_search_sum( int val ) {
    int last= -1, st= 1, dr= N, mid= (st+dr)/2;
    while( st <= dr ) {
        mid= (st+dr)/2;
        int Qry= Querry_aib( mid );
        if( Qry <= val ) {
            last= Qry;
            st= mid + 1;
            if( last == val ) break;
        }
        else {
            dr= mid - 1;
        }
    }
    if( last == val ) return mid;
    return -1;
}

int main() {
    in >> N >> Q;
    for( int i= 1;  i<=N;  ++i ) {
        int a;
        in >> a;
        Update_aib( i, a );
    }
    for( int i= 1;  i<=Q;  ++i ) {
        int op, x,y,p;
        in >> op;
        if( op == 0 ) {   ///  O( log2(N) )
            in >> p >> x;
            Update_aib( p, x );
        }
        if( op == 1 ) {   ///  O( log2(N) )
            in >> x >> y;
            out << Querry_aib( y ) - Querry_aib( x-1 ) << '\n';
        }
        if( op == 2 ) {   ///  O( log2(N) )
            in >> x;
            out << Bin_search_sum( x ) << '\n';
        }
    }
    return 0;
}