Cod sursa(job #2049152)

Utilizator DawlauAndrei Blahovici Dawlau Data 26 octombrie 2017 21:40:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX=100005;
int aib[NMAX],n,m;
int zeros(int x){
    return x&(x^(x-1));
}
void update(int pos,int val){
    int i;
    for(i=pos;i<=n;i+=zeros(i))
        aib[i]+=val;
}
int query(int pos){
    int sum=0,i;
    for(i=pos;i>0;i-=zeros(i))
        sum+=aib[i];
    return sum;
}
int bin_search(int val){
    int i,step;
    for(step=1;step<n;step<<=2);
    for(i=0;step;step>>=1)
        if(i+step<=n&&aib[i+step]<=val){
            i+=step;
            val-=aib[i];
            if(val==0)
                return i;
        }
    return -1;
}
void read_data(){
    int i,x;
    fin>>n>>m;
    for(i=1;i<=n;++i){
        fin>>x;
        update(i,x);
    }
}
void solve(){
    int code,a,b;
    while(m--){
        fin>>code;
        if(code!=2){
            fin>>a>>b;
            if(code==0)
                update(a,b);
            else
                fout<<query(b)-query(a-1)<<'\n';
        }
        else{
            fin>>a;
            fout<<bin_search(a)<<'\n';
        }
    }
}
int main(){
    read_data();
    solve();
}