Cod sursa(job #759753)

Utilizator GotenAmza Catalin Goten Data 19 iunie 2012 02:06:30
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#define nMAX 1 << 14

using namespace std;

int n, m;
int v[ nMAX ], s[ nMAX ];
ofstream write( "aib.out" );

int first_1( int k )
{
	return ( k ^ ( k - 1 ) ) & k;
}

void add( int pos, int value )
{	
	s[ pos ] += value;
	pos += first_1( pos );
	if( pos <= n )
		add( pos, value );
}


int sum( int pos )
{
	if( ! pos )
		return 0;
	return s[ pos ] + sum( pos - first_1( pos ) );
}

void sum_query( int begin, int end )
{
	write << sum( end ) - sum( begin - 1 ) << '\n';
}

int query( int value )
{
	if( ! value )
		return 0;
	int i = 1;
	while( s[ i ] <= value && i <= n )
		i <<= 1;
	return ( i >> 1 ) + query( value - s[ i >> 1 ] );
}	

void min_query( int value )
{
	write << query( value ) << '\n'; 
}

int main( )
{
	int a, b, op;
	ifstream read( "aib.in" );
	read >> n >> m;
	for( int i = 1; i <= n; ++ i )
	{
		read >> v[ i ];
		add( i, v[ i ] );
	}
	for( int i = 1; i <= m; ++ i )
	{
		read >> op;
		if( ! op )
		{
			read >> a >> b;
			add( a, b );
		}
		else 
			if( op == 1 )
			{
				read >> a >> b;
				sum_query( a, b );
			}
			else 
			{
				read >> a;
				min_query( a );
			}
	}
	return 0;
}