Cod sursa(job #1231311)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 20 septembrie 2014 11:46:13
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 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;
            }
            fprintf(g,"%d\n",u);
        }
    }


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