Cod sursa(job #366368)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 noiembrie 2009 17:11:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>

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

#define zeros(x) ((x^(x-1))&x)

#define Nmax 101838

int tip,a,b,Aib[Nmax*3],v[Nmax],n,m;

void add(int x, int val)
{
	int i;
	for (i=x;i<=n;i+=zeros(i))
		 Aib[i]+=val;
}

inline int query(int n)
{
	int ret=0,i;
	for (i=n;i>0;i-=zeros(i))
		 ret+=Aib[i];
	
	return ret;
}

inline int bs(int val)
{
	int step,i;
	
	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==0)
					  return i;
			  }
	return -1;
}	

int main()
{
	int i;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	
	scanf("%d %d", &n, &m);
	
	for (i=1;i<=n;++i)
	{
		scanf("%d", &v[i]);
		add(i,v[i]);
	}
	
	
	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
		{
			scanf("%d", &a);
			printf("%d\n", bs(a));
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	
	return 0;
	
}