Cod sursa(job #2260022)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 14 octombrie 2018 11:52:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include<cstdio>
using namespace std;
FILE *in=fopen("aib.in","r");
FILE *out=fopen("aib.out","w");
int n,m,x,c,a,b,tree[100005];
void update(int i,int x)
{
    while(i<=n){
        tree[i]+=x;
        i+=(i & -i);
    }
}
int query(int i){
    int s=0;
    while(i>0){
        s+=tree[i];
        i-=(i & -i);
    }
    return s;
}
int bs(int a)
{
    int i=0,step=1;
    while(step<n) step<<=1;
    while(step){
        if(i+step<=n){
            if(a>=tree[i+step]){
                a-=tree[i+step];
                i+=step;
                if(a==0) return i;
            }
        }
        step>>=1;
    }
    return -1;
}
int main(){
    fscanf(in,"%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        fscanf(in,"%d",&x);
        update(i,x);
    }
    while(m--){
        fscanf(in,"%d",&c);
        if(c==0){
            fscanf(in,"%d%d",&a,&b);
            update(a,b);
        }
        else if(c==1){
            fscanf(in,"%d%d",&a,&b);
            fprintf(out,"%d\n",query(b)-query(a-1));
        }
        else{
            fscanf(in,"%d",&a);
            fprintf(out,"%d\n",bs(a));
        }
    }
}