Cod sursa(job #627387)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 29 octombrie 2011 19:19:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
int c[100002],n,m;

int zero(int x){
    int i;
    for(i=0;!(x&1<<i);i++); return 1<<i;
}

void update(int i,int x){
    for(;i<=n;i+=zero(i))c[i]+=x;
}

int query(int i){
    int x=0;
    for(;i>0;i-=zero(i))x+=c[i]; return x;
}

int cb(int st,int dr,int x){
    if(st==dr){ if(st==0||st==n-1)return -1;else
    if(query(dr)==x)return dr; else return -1; } else {
    int md=(st+dr)/2;
        if(query(md)<x)return cb(md+1,dr,x); else return cb(st,md,x); }
}

void read_data(){
    int i,x,y,op;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++){
            scanf("%d",&x);
            update(i,x); };
        for(i=1;i<=m;i++){
            scanf("%d",&op);
            if(op<2){
                scanf("%d%d",&x,&y);
                if(op==0)update(x,y); else printf("%d\n",query(y)-query(x-1)); } else
            {
                scanf("%d",&x);
                printf("%d\n",cb(0,n+1,x));
            }
        }
}

int main(){
    read_data();
}