Cod sursa(job #628279)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 31 octombrie 2011 22:58:09
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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;
	for(i=1;i<=n;i*=2)
	{
		if(aib[i]==a)
			return i;
		else if(aib[i]>a)
			break;
	}
	if(i==1)
		return -1;
	else i/=2;
	for(i++;i<=n && a>0;i++)
		a-=v[i];
	if(a==0)
		return i;
	else 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);
		else if(cmd==1)
			printf("%d\n",comanda1(x,y));
		else if(cmd==2)
			printf("%d\n",comanda3(x));
		//printf("****%d %d %d****\n",cmd,x,y);
	}
	//afisare();
	return 0;
}