Cod sursa(job #1535831)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 25 noiembrie 2015 11:18:37
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#define lim 100000
#define LOG 16
int aib[lim+1],n;
void update(int poz,int val){
    while(poz<=n){
        aib[poz]+=val;
        poz=poz+(poz&(-poz));
    }
}
int query(int poz){
    int s=0;
    while(poz!=0){
        s+=aib[poz];
        poz=poz-(poz&(-poz));
    }
    return s;
}
int cautbin(int val){
    int poz,pas;
    poz=0;
    pas=1<<LOG;
    while(pas!=0){
        if(poz+pas<=n&&aib[poz+pas]<=val){
            poz+=pas;
            val-=aib[poz];
        }
        pas/=2;
    }
    return poz;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("aib.in","r");
    fout=fopen("aib.out","w");
    int m,i,val,poz,cer,s,l1,l2;
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
        fscanf(fin,"%d",&val);
        update(i,val);
    }
    for(i=1;i<=m;i++){
        fscanf(fin,"%d",&cer);
        if(cer==0){
            fscanf(fin,"%d%d",&poz,&val);
            update(poz,val);
        }
        if(cer==1){
            fscanf(fin,"%d%d",&l1,&l2);
            s=query(l2)-query(l1-1);
            fprintf(fout,"%d\n",s);
        }
        if(cer==2){
            fscanf(fin,"%d",&val);
            poz=cautbin(val);
            if(query(poz)!=val)
                poz=-1;
            fprintf(fout,"%d\n",poz);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}