Cod sursa(job #1766781)

Utilizator mihai2003LLL LLL mihai2003 Data 28 septembrie 2016 16:07:19
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <cstdio>
using namespace std;
int aib[100000+5];
int n;
int query(int p){
    int rez=0,pow2;
    while(p!=0){
        rez+=aib[p];
        pow2=(p&(-p));
        p-=pow2;
    }
    return rez;
}
int searchh(int val){
    int i=0,pas=1<<16;
    while(pas!=0){
        if(i+pas<=n && aib[i+pas]<=val){
            i+=pas;
            val-=aib[i];
            if(val==0)return i;
        }
        pas/=2;
    }
    return -1;
}
void update(int p,int val){
    int pow2;
    while(p<=n){
        aib[p]+=val;
        pow2=(p&(-p));
        p+=pow2;
    }
}
int main()
{
    int k,b,a,r;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&b),update(i,b);
    for(int i=1;i<=k;i++){
        scanf("%d",&r);
        if(r==0 || r==1)
            scanf("%d %d",&a,&b);
        else
            scanf("%d",&a);
      //  printf("%d %d\n",a,b);
        if(r==0){
            update(a,b);
            continue ;
        }
        if(r==1){
            printf("%d\n",query(b)-query(a-1));
            continue ;
        }
        printf("%d\n",searchh(a));
    }
    return 0;
}