Cod sursa(job #2374089)

Utilizator Vlad3108Tir Vlad Ioan Vlad3108 Data 7 martie 2019 16:54:04
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
#define LMAX 100005
using namespace std;
int n,AIB[LMAX];
void Update(int poz,int val){
    for(;poz<=n;poz+=(poz&-poz))
        AIB[poz]+=val;
}
int Query(int poz){
    int ans=0;
    for(;poz>0;poz-=(poz&-poz))
        ans+=AIB[poz];
    return ans;
}
int Query2(int val){
    int ans=0,bit=1;
    for(;bit<n;bit<<=1);
    for(;bit>0;bit>>=1){
        if(bit+ans<=n&&AIB[bit+ans]<=val){
            val-=AIB[bit+ans];
            ans+=bit;
        }
    }
    if(val!=0)
        return -1;
    return ans;
}
int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int q;
    scanf("%d %d",&n,&q);
    for(int i=1;i<=n;++i){
        int x;
        scanf("%d",&x);
        Update(i,x);
    }
    while(q--){
        int tip,a,b;
        scanf("%d",&tip);
        if(tip==0){
            scanf("%d %d",&a,&b);
            Update(a,b);
        }
        else if(tip==1){
            scanf("%d %d",&a,&b);
            printf("%d\n",Query(b)-Query(a-1));
        }
        else{
            scanf("%d",&a);
            printf("%d\n",Query2(a));
        }
    }
    return 0;
}