Cod sursa(job #1143755)

Utilizator omerOmer Cerrahoglu omer Data 15 martie 2014 22:31:42
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<stdio.h>
using namespace std;
FILE *f,*g;
long long aib[100001];
int n;
int next(int i){
    return ((i<<1)-(i&(i-1)));
}
int prev(int i){
    return i&(i-1);
}
void update(int a,int b){
    while(a<=n){
        aib[a]+=(long long)b;
        a=next(a);
    }
}
long long query(int a){
    long long sol=0;
    while(a){
        sol+=aib[a];
        a=prev(a);
    }
    return sol;
}
long long query(int a, int b){
    return query(b)-query(a-1);
}
int ques(int k){
    int r=n,l=n,mid;
    long long sol=query(n),s;
    if (k>sol) return -1;
    while (sol>k){
        sol-=aib[l];
        r=l;
        l=prev(l);
    }
    while(r-l>1){
        mid=(r+l)/2;
        s=aib[mid];
        if (sol+s<=k) {l=mid;sol+=s;}
        else r=mid;
    }
    if (sol==k) return l;
    else return -1;
}
void read(void){
    int m,i,x,a,b;
    f=fopen("aib.in","r");
    g=fopen("aib.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&a);
        update(i,a);
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d",&x);
        if (x==0||x==1){
            fscanf(f,"%d%d",&a,&b);
            if (x) fprintf(g,"%lld\n",query(a,b));
            else update(a,b);
        }
        else {
            fscanf(f,"%d",&a);
            fprintf(g,"%d\n",ques(a));
        }
    }
}
int main(void){
    read();
    return 0;
}