Cod sursa(job #2414483)

Utilizator cyg_TheoPruteanu Theodor cyg_Theo Data 24 aprilie 2019 16:48:03
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>

using namespace std;

const int NMAX = 100002;

int aib[NMAX];

int n;

void update(int idx, int val){
    for(;idx<=NMAX;idx+=idx&-idx)
        aib[idx]+=val;
}

int query(int idx){
    int ans=0;
    for(;idx;idx-=idx&-idx)
        ans+=aib[idx];
    return ans;
}

int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,x;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        scanf("%d",&x);
        update(i,x);
    }

    int caz,a,b;

    for(;m;m--){
        scanf("%d%d",&caz,&a);
        if(caz==2){
            int nowSum=0,best=0;

            for(int step=20;step>=0;step--){
                if(best+(1<<step)<NMAX && nowSum + aib[best+(1<<step)]<a){
                    best+=(1<<step);
                    nowSum+=aib[best];
                }
            }

            ++best;
            if(query(best)==a)
                printf("%d\n",best);
            else
                printf("-1\n");


        }else{
            scanf("%d",&b);
            if(caz==0)
                update(a,b);
            if(caz==1)
                printf("%d\n",query(b)-query(a-1));
        }
    }

    return 0;
}