Cod sursa(job #979065)

Utilizator assa98Andrei Stanciu assa98 Data 31 iulie 2013 14:02:41
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>

using namespace std;


int v[100100];

int n;

void update(int pos,int a){
    while(pos<=n){
        v[pos]+=a;
        pos+=(pos&(pos-1))^pos;
    }
}

int query(int pos){
    int sum=0;
    while(pos>0){
        sum+=v[pos];
        pos-=(pos&(pos-1))^pos;
    }
    return sum;
}

int search(int a){
    int pos=0;

    int pow=1;
    while((pow<<1)<=n)
        pow<<=1;

    while(pow){
        if(pos+pow<=n&&v[pos+pow]<=a){
            a-=v[pos+pow];
            pos+=pow;
        }
        pow>>=1;
    }
    if(a)
        return -1;
    return pos;
}


int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n;i++){
        int a;
        scanf("%d",&a);
        update(i,a);
    }

    for(int i=1;i<=m;i++){
        int t;
        scanf("%d",&t);
        if(t==0){
            int pos,val;
            scanf("%d%d",&pos,&val);
            update(pos,val);
        }
        else if(t==1){
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d\n",query(y)-query(x-1));
        }
        else {
            int sum;
            scanf("%d",&sum);
            printf("%d\n",search(sum));
        }
    }
    return 0;
}