Cod sursa(job #872757)

Utilizator Mitza444Vidrean Mihai Mitza444 Data 6 februarie 2013 16:03:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>
using namespace std;
#define MAX 100001
int v[MAX],n,m;
void Add(int ind,int val){
    int nr0=0;
    while(ind<=n){
        v[ind]+=val;
        while(!(ind &(1<<nr0))) nr0++;
        ind+=(1<<nr0);
        nr0++;
    }
}
int SecvSum(int ind){
    int nr0=0,sum=0;
    while(ind>0){
        sum+=v[ind];
        while(!(ind &(1<<nr0))) nr0++;
        ind-=(1<<nr0);
        nr0++;
    }
    return sum;
}
int FindKmin(int val){
    int i,pas;
    for(pas=1;pas<n;pas<<=1);
    for(i=0;pas;pas>>=1){
        if(i+pas<=n)
            if(val>=v[i+pas]){
                i+=pas;
                val-=v[i];
                if(!val)
                    return i;
            }
    }
    return -1;
}
int main(){
    int i,x,a,b;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%d",&x);
        Add(i,x);
    }
    while(m--){
        scanf("%d",&x);
        if(x==0){
            scanf("%d%d",&a,&b);
            Add(a,b);
        }
        else if(x==1){
            scanf("%d%d",&a,&b);
            printf("%d\n",SecvSum(b)-SecvSum(a-1));
        }
        else if(x==2){
            scanf("%d",&a);
            printf("%d\n",FindKmin(a));
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}