Cod sursa(job #210642)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 28 septembrie 2008 13:23:50
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
long n,a[100000],m,i,q,x,aa,b;
void pune(long p,long x)
{long y;
 y=0;
 while(p<=n)
 {a[p]+=x;
  while(!(p&(1<<y)))
   ++y;
  p+=(1<<y);++y;}
}
long suma(long p)
{long y,z;
 y=0;z=0;
 while(p>0)
 {z+=a[p];
  while(!(p&(1<<y)))
   ++y;
  p-=(1<<y);++y;}
 return z;
}
long cauta(long x)
{
 long i,j,ii;
 for(i=1;i<n;i<<=1);
 for(j=0;i;i>>=1)
    if(j+i<=n)
      if(x>=a[i+j])
        {j+=i;x-=a[j];if(x==0)return i;}
 return -1;
}
int main()
{
 freopen("aib.in","r",stdin);
 freopen("aib.out","w",stdout);
 scanf("%ld%ld",&n,&m);
 for(i=1;i<=n;++i){scanf("%ld",&q);pune(i,q);}
 for(i=1;i<=m;++i)
    {scanf("%ld%ld",&x,&aa);
     if(x<=1)
       {scanf("%ld",&b);
        if(x==1)printf("%ld\n",(suma(b)-suma(aa-1)));
          else pune(aa,b);
       }
       else
        printf("%ld\n",cauta(aa));
    }
 return 0;
}