Cod sursa(job #1231317)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 20 septembrie 2014 12:00:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
int n,m,i,j,q,aa,b,a[100100],s1,s2,p,u,mid,s;
FILE *f,*g;

int query(int p) {
    int suma = 0;
    for (int i = p; i>0; i-=(i&-i)) {
        suma += a[i];
    }
    return suma;
}

void update(int p, int x) {
    for (int i = p; i<=n; i+=(i&-i)) {
        a[i]+=x;
    }
}

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);
        update(i, q);
    }

    for(i=1;i<=m;i++){
        fscanf(f,"%d",&q);
        if(q==0){
            fscanf(f,"%d%d",&aa,&b);
            update(aa, b);
        }
        else if(q==1){
            fscanf(f,"%d%d",&aa,&b);

            fprintf(g,"%d\n",query(b)-query(aa-1));
        }
        else{
            fscanf(f,"%d",&aa);
            p=1;
            u=n;
            while(p<=u){
                mid=(p+u)/2;
                s = query(mid);
                if (s >= aa)
                    u = mid-1;
                else
                    p = mid + 1;
            }
            s=query(p);
            if(s==aa)
                fprintf(g,"%d\n",p);
            else
                fprintf(g,"-1\n");
        }
    }

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