Cod sursa(job #288840)

Utilizator gggbbbyyyDarkMan gggbbbyyy Data 26 martie 2009 10:00:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#define Nmax 100000
int aib[Nmax],i,j,k,l,m,n,x,y;

void upd(int poz,int val){
int k=0;

while(poz<=n)
	{aib[poz]+=val;
		while(!(poz&(1<<k)))k++;
		poz+=1<<k;

		k+=1;
	}
}

int querry(int poz){
int k=0,sum=0;
while(poz>0)
	{sum+=aib[poz];
	while(!(poz&(1<<k)))k++;
	poz-=1<<k;
	k++;
	}
return sum;
}
 int Search(int val)
 {
	int i, step;

	for ( step = 1; step < n; step <<= 1 );

	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);

for(i=1;i<=n;i++){
	scanf("%d",&x);
	upd(i,x);}

for(i=1;i<=m;i++)
	{scanf("%d",&k);
	if(k==0)
		{scanf("%d %d",&x,&y);
		upd(x,y);
		}
	else
	if(k==1)
		{scanf("%d %d",&x,&y);
		printf("%d\n",querry(y)-querry(x-1));
		}
	else
		{scanf("%d",&x);
		printf("%d\n",Search(x));
		}
	}


return 0;}