Cod sursa(job #1041889)

Utilizator teoionescuIonescu Teodor teoionescu Data 26 noiembrie 2013 12:42:42
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#define ll long long
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const ll Nmax = 100002;
ll A[Nmax];
ll N,M;
ll lsb(ll &x){
    return ( x & (-x) );
}
ll query(ll x){
    ll sum=0;
    while(x>0){
        sum+=A[x];
        x-=lsb(x);
    }
    return sum;
}
void update(ll x,ll val){
    while(x<=N){
        A[x]+=val;
        x+=lsb(x);
    }
}
ll kquery(ll a){
    ll ans=0,x=1LL<<40;
    while(x>0){
        if( ans+x <= N && A[ans+x] <= a ){
            a-=A[ans+x];
            ans+=x;
        }
        x>>=1;
    }
    if(a==0) return ans;
    return -1;
}
int main(){
    in>>N>>M;
    for(ll i=1;i<=N;i++){
        ll x;
        in>>x;
        update(i,x);
    }
    for(ll i=1;i<=M;i++){
        ll c,a,b;
        in>>c;
        if(c==0){
            in>>a>>b;
            update(a,b);
        }
        if(c==1){
            in>>a>>b;
            out<<query(b)-query(a-1)<<'\n';
        }
        if(c==2){
            in>>a;
            out<<kquery(a)<<'\n';
        }
    }
    return 0;
}