Cod sursa(job #838954)

Utilizator cristi_berceanuFMI - Cristi Berceanu cristi_berceanu Data 20 decembrie 2012 22:22:25
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<cstdio>
#define NMAX 100100
#define LSB(x) (x&(-x))
int x,y,op,n,m;
int arb[NMAX];

void update(int poz, int x)
{
	for(;poz<=n;poz+=LSB(poz))
	arb[poz]+=x;
}

int querymuie(int poz)
{
	int sum=0;
	for(;poz>0;poz-=LSB(poz))
		sum+=arb[poz];
	return sum;
}

int cautare(int a)
{
	int m,x=1,y=n;
	while(x<=y)
	{
		m=(x+y)/2;
		if(querymuie(m)<a)
		x=m+1;
		else
			if(querymuie(m)>a)
				y=m-1;
			else
				return m;
	}
	return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);

for(int i=1;i<=n;i++)
{

	scanf("%d",&x);
	update(i,x);
}
for(int i=1;i<=m;i++)
{

	scanf("%d",&op);
	switch(op)
	{
	
		case 0:{
			scanf("%d%d",&x,&y);
			update(x,y);
			break;
		}
		
		case 1:{
			scanf("%d%d",&x,&y);
			printf("%d\n",querymuie(y)-querymuie(x-1));
			break;
		}
		
		case 2:{
		scanf("%d",&x);
		printf("%d\n",cautare(x));
		break;
		}
	
	}
}
return 0;
}