Cod sursa(job #759758)

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

using namespace std;

int n, m, doi = 1;
int v[ nMAX ], s[ nMAX ];
ofstream scribble( "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 )
{
	scribble << sum( end ) - sum( begin - 1 ) << '\n';
}

int query( int value )
{
	int res = 0, bit = doi;
	while( bit )
	{
		if( res + bit <= n )
			if( value >= s[ res + bit ] )
			{
				value -= s[ res + bit ];
				res += bit;
				if( ! value )
					return res;
			}
		bit >>= 1;
	}
	return -1;
}	

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

int main( )
{
	int a, b, op;
	ifstream read( "aib.in" );
	read >> n >> m;
	while( ( doi << 1 ) <= n )
		doi <<= 1;
	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;
}