Cod sursa(job #342919)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 24 august 2009 13:30:38
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>
#define lm 100010

int v[lm], n, m;

void update(int p, int val)
{
	do
	{
		v[p] += val;
		p += (p&(p-1))^p;
		//printf("%d\n",p);
	}
	while (p<=n);
		
}

int query(int p)
{
	int s=0;
	do
	{
		s += v[p];
		p = p & (p-1);
	}
	while (p);
	return s;
}

int search (int x)
{
	int a, p=0, s=0;
	for (a=1; a<=n; a<<= 1);
	a >>= 1;
	while (a)
	{
		if (s+v[p+a]<=x) 
		{
			p += a;
			s += v[p] ;
		}
		a >>= 1;
	}
	if (s!=x) p=-1;
	return p;
}
		
	

int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n, &m);
	int i, a, b, t;
	for (i=1; i<=n; i++) 
	{
		scanf("%d",&a);
		update (i,a);
	}
	while (m--)
	{
		scanf("%d",&t);
		if (t<2)
		{
			scanf("%d %d",&a, &b);
			if (!t) update (a,b); else
			{
				b = query(b);
				a = query(a-1);
				printf("%d\n",b-a);
			}
		} else
		{
			scanf("%d",&a);
			printf("%d\n", search (a));
		}
	}
}