Cod sursa(job #1041879)

Utilizator teoionescuIonescu Teodor teoionescu Data 26 noiembrie 2013 12:32:29
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int Nmax = 100002;
int A[Nmax];
int N,M;
int lsb(int &x){
    return ( x & (-x) );
}
int query(int x){
    int sum=0;
    while(x>0){
        sum+=A[x];
        x-=lsb(x);
    }
    return sum;
}
void update(int x,int val){
    while(x<=N){
        A[x]+=val;
        x+=lsb(x);
    }
}
int kquery(int a){
    int ans=0,x=1<<31;
    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(int i=1;i<=N;i++){
        int x;
        in>>x;
        update(i,x);
    }
    for(int i=1;i<=M;i++){
        int 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;
}