Cod sursa(job #458325)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 24 mai 2010 15:43:34
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>

#define file_in "aib.in"
#define file_out "aib.out"

#define zero(x) ((x^(x-1))&x)
#define nmax 101000

int n,m;
int aib[nmax];

void add(int poz, int x)
{
	int i;
	
	for (i=poz;i<=n;i+=zero(i))
		 aib[i]+=x;
}

int query(int poz)
{
	int i,rez=0;
	
	for (i=poz;i>=1;i-=zero(i)) 
		 rez+=aib[i];
    return rez;
}

int search(int X)
{
	int i,step;
	
	for (step=1;step<n;step<<=1);
	     for (i=0;step;step>>=1)
			  if (i+step<=n && aib[i+step]<=X)
			  {
				  i+=step;
				  X-=aib[i];
				  if (X==0)
					  return i;
			  }
	return -1;
}	
			  

void citire()
{
	int i,x;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
	for (i=1;i<=n;++i)
	{
		scanf("%d", &x);
		add(i,x);
	}
}

void solve()
{
	int a,b,tip;
     while(m--)
	 {
		 scanf("%d", &tip);
		 if (tip==0)
		 {
			 scanf("%d %d", &a, &b);
			 add(a,b);
		 }
		 else
		 if (tip==1)
         {
			 scanf("%d %d",&a, &b);
			 printf("%d\n", query(b)-query(a-1));
		 }
		 else
		 if (tip==2)	 
		 {
			 scanf("%d", &a);
			 printf("%d\n", search(a));
		 }
	 }
}

int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}