Cod sursa(job #807799)

Utilizator raulstoinStoin Raul raulstoin Data 5 noiembrie 2012 18:58:18
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>
#define nmax 100005
using namespace std;
int n,m,v[nmax],aib[nmax];
void update(int poz,int val)
{
	int i;
	for(i=poz;i<=n;i+=(i&(-i)))
		aib[i]+=val;
}
int query(int a,int b)
{
	int i,s=0;
	for(i=b;i;i-=(i&(-i)))
		s+=aib[i];
	for(i=a-1;i;i-=(i&(-i)))
		s-=aib[i];
	return s;
}
int search(int val)
{
	int i,step=1<<n;
	for(i=0;step;step>>=1)
		if(i+step<=n)
			if(val>=aib[i+step])
			{
				i+=step;
				val-=aib[i];
				if(!val)
					return i;
			}
	return -1;
}
int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i,choice,a,b;
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
	for(i=1;i<=n;i++)
		update(i,v[i]);
	while(m--)
	{
		scanf("%d",&choice);
		switch(choice)
		{
			case 0:
				{
					scanf("%d %d",&a,&b);
					update(a,b);
					break;
				}
			case 1:
				{
					scanf("%d %d",&a,&b);
					printf("%d\n",query(a,b));
					break;
				}
			case 2:
				{
					scanf("%d",&a);
					printf("%d\n",search(a));
					break;
				}
		}
	}
	return 0;
}