Cod sursa(job #385775)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 23 ianuarie 2010 14:42:12
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<cstdio>
#define N 100001
int c[N],val,n,m,suma1,suma2,q,x,y;
int rez(int x)
{
	suma1=0;
	for (;x; x-=x^(x-1)&x)
		suma1+=c[x];
	return suma1;
}
int caut()
{
	int p=1, u=n,m;
	while (u!=p)
	{
		m=(u+p)>>1;
		if (rez(m)<=x)
			p=m+1;
		else
			u=m;
	}
	q=rez(p);
	if (q>x)
		--p;
	if (rez(p)!=x)
		return -1;
	return p;
}
void update(int x, int val)
{
	for (;x<=n; x+=x^(x-1)&x)
		c[x]+=val;
}
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,val);
	}
	while (m--)
	{
		scanf("%d",&q);
		if (!q)
		{
			scanf("%d%d",&x,&y);
			for (;x<=n; x+=x^(x-1)&x)
				c[x]+=y;
			continue;
		}
		if (q==1)
		{
			scanf("%d%d",&x,&y);
			suma1=0;suma2=0;
			--x;
			for (;x;x-=x^(x-1)&x)
				suma1+=c[x];
			for (;y;y-=y^(y-1)&y)
				suma2+=c[y];
			printf("%d\n",suma2-suma1);
			continue;
		}
		scanf("%d",&x);
		printf("%d\n",caut());
	}
}
int main()
{
	citire();
	return 0;
}