Cod sursa(job #368443)

Utilizator alexeiIacob Radu alexei Data 24 noiembrie 2009 21:31:47
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define NMAX 100006

int A[NMAX];
int N;

inline int smen( int n )
{
	return n^ ( n&(n-1) );
}

void add( int poz,int val )
{	
	while( poz<=N )
	{
		A[poz]+=val;
		poz+=smen(poz);
	}
}

int sum( int poz )
{
	int ANS=0;
	while( poz )
	{
		ANS+=A[poz];
		poz-=smen(poz);
	}

	return ANS;
}

int find( int val )
{
	int log;
	for(log=1; log<N; log<<=1 );

	int a1;
	int i;
	for( i=0; log; log>>=1 )
	{
		a1=i+log;
		if( a1 <= N )
		{
			if( A[a1] <= val )
			{
				i=a1;val-=A[a1];
				
				if( !val ) return i;
			}
		}
	}

	return -1;
}

int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);

	int M;
	scanf("%d%d",&N,&M);

	int i,a1,p,val;
	for(i=1; i<=N; ++i)
	{
		scanf("%d",&val);
		add( i, val );
	}

	int v1,v2;int K;
	while( M-- )
	{
		scanf("%d",&a1);

		if( !a1 )
		{
			scanf("%d%d",&p,&val);
			add( p, val );
			continue;
		}
		if( a1==1 )
		{
			scanf("%d%d",&v1,&v2);
			printf("%d\n",sum(v2)-sum(v1-1));
			continue;
		}
		if( a1==2 )
		{
			scanf("%d",&K);
			printf("%d\n",find(K));
		}
	}

	return 0;
}