Cod sursa(job #1773039)

Utilizator bogdi1bogdan bancuta bogdi1 Data 7 octombrie 2016 14:47:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>

using namespace std;
int aib[100005],n;
void update(int poz,int val)
{
  for( ; poz<=n; poz+=poz&-poz)
    aib[poz]+=val;
}
int query(int poz)
{
  int s=0;
  for( ; poz; poz-=poz&-poz)
    s=s+aib[poz];
  return s;
}
int bs(int val)
{
    int i=0;
    int pas=1<<15;
    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;
}
int main()
{   freopen("aib.in", "r",stdin);
    freopen("aib.out", "w",stdout);
    int m,i,op,a,b,val;
    scanf("%d%d", &n, &m);
    for(i=1;i<=n; i++){
      scanf("%d", &val);
      update(i, val);
    }
    for(i=1; i<=m; i++){
      scanf("%d", &op);
      if(op==0){
        scanf("%d%d", &a, &b);
        update(a, b);
      }
      else{
        if(op==1){
          scanf("%d%d", &a, &b);
          printf("%d\n", query(b)-query(a-1));
        }
        else{
          scanf("%d", &a);
          printf("%d\n", bs(a));
        }
      }
    }
    return 0;
}