Cod sursa(job #2403518)

Utilizator rares1012Rares Cautis rares1012 Data 11 aprilie 2019 17:38:57
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

int aib[100001];

int get(int k){
    int sum=0;
    while(k!=0){
        sum+=aib[k];
        k=k&(k-1);
    }
    return sum;
}

int n;

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

int main()
{
    int m,a,i,b,s,r,p,cer;
    FILE*fi,*fo;
    fi=fopen("aib.in","r");
    fo=fopen("aib.out","w");
    fscanf(fi,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(fi,"%d",&a);
        update(i,a);
    }
    for(i=1;i<=m;i++){
        fscanf(fi,"%d",&cer);
        if(cer==0){
            fscanf(fi,"%d%d",&a,&b);
            update(a,b);
        }
        else if(cer==1){
            fscanf(fi,"%d%d",&a,&b);
            s=get(b)-get(a-1);
            fprintf(fo,"%d\n",s);
        }
        else {
            fscanf(fi,"%d",&a);
            r=0;
            p=1<<20;
            while(p>0){
                if(r+p<=n && get(r+p)<a){
                    r+=p;
                }
                p/=2;
            }
            if(get(r+1)==a)
                fprintf(fo,"%d\n",r+1);
            else fprintf(fo,"-1\n");
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}