Cod sursa(job #1575181)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 21 ianuarie 2016 10:49:22
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#include<cstring>
int n,m,i,j,op,a,b,s1,s2,s,xstep,v[100100];
FILE *f,*g;
void upd(int a,int b){
    for(j=a ; j<=n ; j += ( j & ( - j ) ) ){
        v[j]+=b;
    }
}
int query(int a,int b){
    s1=s2=0;
    int j;
    for(j=a-1 ; j>0 ; j -= ( j & ( - j ) ) ){
        s1+=v[j];
    }
    for(j=b ; j>0 ; j -= ( j & ( - j ) ) ){
        s2+=v[j];
    }
    return s2-s1;
}
int sa(int a){
    int s=0,j=0;
    for( xstep = 1; xstep < n; xstep <<= 1 );
    for(; xstep > 0 ; xstep>>=1 ){
        if( j + xstep <= n){
            if(s + v[j+xstep] < a) {
                s+=v[j+xstep];
                j+=xstep;
            }
        }
    }
    if(query(1,j+1)==a)
        return j+1;
    return -1;
}
int main(){
    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);
        for(j=i ; j<=n ; j += ( j & ( - j ) ) ){
            v[j]+=a;
        }
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d",&op);
        if(!op){
            fscanf(f,"%d%d",&a,&b);
            upd(a,b);
        }
        else if(op==1){
            fscanf(f,"%d%d",&a,&b);
            fprintf(g,"%d\n",query(a,b));
        }
        else{
            fscanf(f,"%d",&a);
            fprintf(g,"%d\n",sa(a));
        }
    }





    fclose(f);
    fclose(g);
    return 0;
}