Cod sursa(job #628305)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 31 octombrie 2011 23:39:50
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>

using namespace std;

int n,m,v[100002],aib[100002];

void comanda0(int a,int b)
{
	for(;a<=n;a+=(a&(a-1))^a)
	{
		aib[a]+=b;
	}
}

int comanda2(int a)
{
	int sum=0;
	for(;a>=1;a-=(a&(a-1))^a)
	{
		sum+=aib[a];
	}
	return sum;
}

int comanda1(int a,int b)
{
	return comanda2(b)-comanda2(a-1);
}

int comanda3(int a)
{
	int i,ii;
	for(i=1;i<=n;i<<=1)
	{
		if(aib[i]==a)
			return i;
		else if(aib[i]>a)
			break;
	}
	if(i==1)
		return -1;
	i>>=1;
	a-=aib[i];
	for(ii=i;ii>=1;ii>>=1)
	if(ii+i<=n && aib[ii+i]<=a)
	{
		i+=ii;
		a-=aib[i];
		if(a==0)
			return i;
	}
	return -1;
}

void citire()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&v[i]);
		comanda0(i,v[i]);
	}
}

void afisare()
{
	for(int i=1;i<=n;i++)
		printf("%d ",aib[i]);
	printf("\n");
}

int main()
{
	freopen("aib.in","rt",stdin);
	freopen("aib.out","wt",stdout);
	citire();	
	int cmd,x,y;
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&cmd,&x);
		if(cmd!=2)
			scanf("%d",&y);
		if(cmd==0)
		{
			comanda0(x,y);
			v[x]+=y;
		}
		else if(cmd==1)
			printf("%d\n",comanda1(x,y));
		else if(cmd==2)
			if(x==0)
				printf("-1\n");
			else
				printf("%d\n",comanda3(x));
		//printf("****%d %d %d****\n",cmd,x,y);
	}
	//afisare();
	return 0;
}