Cod sursa(job #1028031)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 13 noiembrie 2013 16:18:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
using namespace std;
ifstream in("aib.in"); ofstream out("aib.out");
int t,a,b,n,m,x,c[100001];
void update(int poz, int val){
    for(int i=poz; i<=n; i+= (i & -i)) c[i]+=val;
}
int sum(int st, int dr){
    int s=0;
    for(int i=dr; i; i-=(i & -i)) s+=c[i];
    for(int i=st-1; i; i-=(i & -i)) s-=c[i];
    return s;
}
void query(int a){
    int st=1, dr=n;
    int mid,acm;
    while(st<=dr){
        mid=(st+dr)/2;
        acm=sum(1,mid);
        if(acm==a){out<<mid<<'\n'; return ;}
        if(acm>a) { dr=mid-1; continue;}
        else st=mid+1;
    }
    out<<-1<<'\n';
}
int main(){
    in>>n>>m;
    for(int i=1;i<=n;++i){ in>>x; update(i,x);}
    for(int i=1;i<=m;++i){
        in>>t;
        if(t==2){
            in>>a;
            query(a);
        }
        else{
            in>>a>>b;
            if(t==0) update(a,b);
            else out<<sum(a,b)<<'\n';
        }
    }
    out.close();
    return 0;
}