Cod sursa(job #222523)

Utilizator amadaeusLucian Boca amadaeus Data 23 noiembrie 2008 02:06:27
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>

using namespace std;

int M, N, logN, T[100010];

void upd( int x, int y ) {
	for( ; x <= N; x += x & -x )
		T[x] += y;
}

int qu( int x ) {
	int s = 0;
	for( ; x; x -= x & -x )
		s += T[x];
	return s;
}

void que1( int x, int y ) {
	printf( "%d\n", qu( y ) - qu( x-1 ) );
}

void que2( int x ) {
	int step, i, xx = x;

	for( step = logN, i = 0; step; step >>= 1 ) {
		if( (i+step <= N ) && (T[ i+step ] < x )) {
			i += step; x -= T[i];
		}
	}
	if( qu( i+1 ) == xx )
		printf( "%d\n", i+1 );
	else
		printf( "-1\n" );
}

int main() {
	int i, x, op, a, b;
	
	freopen( "aib.in", "r", stdin );
	freopen( "aib.out", "w", stdout );

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

	for( logN = 1; logN <= N; logN <<= 1 );
	logN >>= 1;
	
	for( i = 1; i <= N; i++ ) {
		scanf( "%d", &x );
		upd( i, x );
	}
		
	while( M-- ) {
		scanf( "%d%d", &op, &a );
		switch( op ) {
			case 0: scanf( "%d", &b ); upd( a, b ); break;
			case 1: scanf( "%d", &b ); que1( a, b ); break;
			case 2: que2( a ); break;
		}
	}

	return 0;
}