Cod sursa(job #1231322)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 20 septembrie 2014 12:02:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>
int n,m,i,j,q,aa,b,a[100100],s1,s2,p,u,mid,s;
FILE *f,*g;
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",&q);
        for(j=i;j<=n;j+=(j&-j)){
            a[j]+=q;
        }
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d",&q);
        if(q==0){
            fscanf(f,"%d%d",&aa,&b);
            for(j=aa;j<=n;j+=(j&-j)){
                a[j]+=b;
            }
        }
        else if(q==1){
            fscanf(f,"%d%d",&aa,&b);
            s1=s2=0;
            for(j=b;j>0;j-=(j&-j)){
                s1+=a[j];
            }
            for(j=aa-1;j>0;j-=(j&-j)){
                s2+=a[j];
            }
            s1-=s2;
            fprintf(g,"%d\n",s1);
        }
        else{
            fscanf(f,"%d",&aa);
            p=1;
            u=n;
            while(p<=u){
                mid=(p+u)/2;
                s=0;
                for(j=mid;j>0;j-=(j&-j)){
                    s+=a[j];
                }
                if(aa<=s)
                    u=mid-1;
                else
                    p=mid+1;
            }
            s=0;
            for(j=p;j>0;j-=(j&-j)){
                s+=a[j];
            }
            if(s==aa)
                fprintf(g,"%d\n",p);
            else
                fprintf(g,"-1\n");
        }
    }


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