Cod sursa(job #491654)

Utilizator c_adelinaCristescu Adelina c_adelina Data 11 octombrie 2010 21:53:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>
#define lsb(x) (int) x&(-x)

int v[100003],n;

void add(int k,int val)
{
	while (k<=n)
	{
		v[k]+=val;
		k+=lsb(k);
	}
}

int sum(int k)
{
	int s=0;
	while (k)
		s+=v[k],k-=lsb(k);
	return s;
}

int main()
{
	int m,i,x,y,a;
	
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (i=1;i<=n;++i)
		{scanf("%d",&x);add(i,x);}
	for (i=1;i<=m;++i)
	{
		scanf("%d",&x);
		if (x==0)
		{scanf("%d %d",&x,&y);add(x,y);}
		else
			if (x==1)
			{scanf("%d%d",&x,&y);printf("%d\n",sum(y)-sum(x-1));} else
			{
				scanf("%d",&a);
				x=1;y=n;int z=(x+y)/2,s=sum(z);
				while (x<=y)
				{
					z=(x+y)/2,s=sum(z);
					if (s>a) y=z-1; else
						if (s<a) x=z+1; else
							break;
				}
				if (s==a) printf("%d\n",z); else
					printf("-1\n");
			}
	}
	return 0;
}