Cod sursa(job #385798)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 23 ianuarie 2010 15:15:44
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<cstdio>
#define N 100001
int c[N],val,q,x,y,n,m;
void update(int x)
{
	for (;x<=n; x+=x^(x-1)&x)
		c[x]+=val;
}
long long suma(int x)
{
	int sum=0;
	for (;x;x-=x^(x-1)&x)
		sum+=c[x];
	return sum;
}
int caut()
{
	int p=1,u=n,m;
	while (p!=u)
	{
		m=(p+u)>>1;
		if (suma(m)<=x)
			p=m+1;
		else
			u=m;
	}
	y=suma(p);
	if (y>x)
		--p;
	y=suma(p);
	if (y!=x)
		return -1;
	return p;
}
void citire()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1; i<=n; ++i)
	{
		scanf("%d",&val);
		update(i);
	}
	while (m--)
	{
		scanf("%d",&q);
		if(!q)
		{
			scanf("%d%d",&x,&val);
			update(x);
			continue;
		}
		if (q==1)
		{
			scanf("%d%d",&x,&y);
			--x;
			printf("%lld\n",suma(y)-suma(x));
			continue;
		}
		scanf("%d",&x);
		if (x<=0)
			printf("-1\n");
		else
		printf("%d\n",caut());
	}
}
int main()
{
	citire();
	return 0;
}