Cod sursa(job #1773061)

Utilizator andra1782Andra Alazaroaie andra1782 Data 7 octombrie 2016 15:02:55
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
int aib[100000],n;

void update(int p, int val){
    while(p<=n){
        aib[p]+=val;
        p+=p&(-p);
    }
}

int query(int p){
    int s=0;

    while(p!=0){
        s+=aib[p];
        p-=p&(-p);
    }
    return s;
}

int cautare_binara(int e){
    int pas,i;

    pas=1<<20;
    i=0;
    while(pas!=0){
        if(i+pas<=n && aib[i+pas]<=e){
            i+=pas;
            e-=aib[i];
            if(e==0)
                return i;
        }
        pas/=2;
    }
    return -1;
}

int main(){
    FILE *fin=fopen("aib.in","r");
    FILE *fout=fopen("aib.out","w");
    int m,i,e,t,a,b;

    fscanf(fin,"%d%d",&n,&m);
    for(i=1; i<=n; i++){
        fscanf(fin,"%d",&e);
        update(i,e);
    }
    for(i=1; i<=m; i++){
        fscanf(fin,"%d%d",&t,&a);
        if(t==0){
            fscanf(fin,"%d",&b);
            update(a,b);
        }else if(t==1){
            fscanf(fin,"%d",&b);
            fprintf(fout,"%d\n", query(b)-query(a-1));
        }else
            fprintf(fout,"%d\n",cautare_binara(a));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}