Cod sursa(job #313301)

Utilizator cristikIvan Cristian cristik Data 8 mai 2009 18:24:12
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
#define bit(x) ( (x ^ (x - 1)) & x )
int v[100001],n,i,j,m,aib[100001];
int bs(int val)
{
    int i,step;
    for(step=1; step<=n; step<<=1);
    for(i=0; step; step>>=1)
     if(i+step<=n && aib[i+step]<=val)
      {
          i+=step;
          val-=aib[i];
          if(!val) return i;
      }
    return -1;
}

void add(int x,int val)
{
    int i;
    for(i=x; i<=n; i+=bit(i))
      aib[i]+=val;
}
int compute(int x)
{
    int i,ret=0;
    for(i=x; i>0; i-=bit(i))
        ret+=aib[i];
    return ret;
}
int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int op,a,b,p;
    scanf("%d %d",&n,&m);
    for(i=1; i<=n; i++) scanf("%d",&v[i]),add(i,v[i]);
    for(; m>0; m--)
    {
        scanf("%d",&op);
        if(op==0) scanf("%d %d",&a,&b),add(a,b);
        if(op==1) scanf("%d %d",&a,&b),printf("%d\n",compute(b)-compute(a-1));
        if(op==2) scanf("%d",&a),printf("%d\n",bs(a));
    }
    return 0;
}