Cod sursa(job #858269)

Utilizator aladinaladin aladinn aladin Data 18 ianuarie 2013 19:00:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#define lsb(x) x&(-x)
int v[100009],aib[100009],n;

void init()
{
	for (int i=1;i<=n;++i)
		aib[i]=v[i]-v[i-(lsb(i))];
}

int query(int poz)
{
	int sum=0;
	for (;poz>0;poz-=lsb(poz))
		sum+=aib[poz];
	return sum;
}

void update(int poz,int val)
{
	for (;poz<=n;poz+=lsb(poz))
		aib[poz]+=val;
}
		



int main()
{
	int m,i;
	
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (i=1;i<=n;++i)
		{scanf("%d",&v[i]);v[i]+=v[i-1];}
	init();
	for (i=1;i<=m;++i)
	{
		int op,x,y;
		scanf("%d",&op);
		if (op==2)
		{
			int sum,rez=-1;
			scanf("%d",&sum);
			x=1;y=n;
			while (x<=y)
			{
				int z=(x+y)/2,sum2=query(z);
				
				if (sum2<sum)
					x=z+1; else
						if (sum2>sum)
							y=z-1; else
								{rez=z;break;}
			}
			printf("%d\n",rez);
		}  else
		{
			scanf("%d %d",&x,&y);
			if (op==0)
				update(x,y); else
					printf("%d\n",query(y)-query(x-1));
		}
	}
return 0;
}