Cod sursa(job #423197)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 23 martie 2010 16:30:18
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>

int i,j,n,m,t[100009],a,x,b;

void update(int x,int val)
{
	for(;x<=n;x+=(x&-x))
		t[x]+=val;
}

int query(int st,int dr)
{
	int x=0,y=0;
	st--;	
	for(;st;st-=(st&-st))
		x+=t[st];
	
	for(;dr;dr-=(dr&-dr))
		y+=t[dr];
	return y-x;
}

int Search(int val)
{
	int step,i;
	for(step=1;step<n;step<<=1);
	
	for(i=0;step;step>>=1)
		
		if(i+step<=n)
		{
			if(t[i+step]<=val)
			{
				i+=step;
				val-=t[i];
				if(!val) return i;
				
			}
		}
	return -1;
}	

























int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(i=1;i<=n;++i)
	{
		scanf("%d",&x);
		update(i,x);
	}
	
	for(i=1;i<=m;++i)
	{
		scanf("%d",&x);
		
		if(!x) 
		{
			scanf("%d %d",&a,&b);
			update(a,b);
		}
		else if(x==1) 
		{
			scanf("%d %d",&a,&b);
			int k=query(a,b);
			printf("%d\n",k);
		}
		else
		{
			scanf("%d",&a);
			int k=Search(a);
			printf("%d\n",k);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}