Cod sursa(job #699471)

Utilizator arch_enemyAngela Gossow arch_enemy Data 29 februarie 2012 19:33:01
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <cstring>

#define NMAX 100005
#define LSB(x) (x&(-x))

int N, Q, i, x, St, Dr, M, Pos, Tip, A, B;
int AIB[NMAX];

inline void Update( int Pos, int Val )
{
	for( int ii = Pos; ii <= N; ii += LSB(ii) )
		AIB[ii] += Val;
}

inline int Query( int Pos )
{
	int Rez = 0;
	for( int ii = Pos; ii; ii -= LSB(ii) )
		Rez += AIB[ii];
	return Rez;
}

int main()
{
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	
	memset( AIB, 0, sizeof(AIB) );
	scanf("%d%d", &N, &Q );
	for( i = 1; i <= N; ++i )
	{
		scanf("%d", &x );
		Update( i, x );
	}
	
	for( ; Q--; )
	{
		scanf("%d", &Tip );
		if( !Tip )
		{
			scanf("%d%d", &A, &B );
			Update( A, B );
		}
		else if( Tip == 1 )
		{
			scanf("%d%d", &A, &B );
			printf("%d\n", Query( B ) - Query( A-1 ) );
		}
		else
		{
			scanf("%d", &A );
			St = 1, Dr = N;
			Pos = -1;
			while( St <= Dr )
			{
				M = St + ((Dr-St)>>1);
				int Rez = Query( M );
				if( Rez == A )
				{
					Pos = M;
					break;
				}
				else if( Rez < A )
					St = M + 1;
				else
					Dr = M - 1;
			}
			printf("%d\n", Pos );
		}
	}
	
	return 0;
}