Cod sursa(job #1548227)

Utilizator jimcarterJim Carter jimcarter Data 10 decembrie 2015 17:47:00
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <cstdio>
#include <algorithm>
using namespace std;
//FILE *f = fopen ( "aib.in" , "r" ) , *g = fopen ( "aib.out" , "w" );

const int MAX = 100005;
int N , nrQueries , Tree [ MAX ] , value , S , sum , totalSum , left , right , i , mid , queryType , index , pos;

void update ( int index , int value )
{
	while ( index <= N )
	{
		Tree [ index ] += value;
		index += ( index & -index );
	}
}

int detSum ( int index )
{
	totalSum = 0;
	while ( index > 0 )
	{
		totalSum += Tree [ index ];
		index -= ( index & -index );
	}
	return totalSum;
}

int detIndex ( int sum )
{
	left = 0; right = N + 1; pos = N + 1; mid = N;
	S = detSum ( N );
	if ( S == sum ) pos = N;

	while ( mid )
	{
		mid = ( left + right ) >> 1;
		S = detSum ( mid );

		if ( S > sum )
		{
			right = min ( right , mid );
			mid --;
		}
		else
			if ( S == sum )
            {
				pos = min ( pos , mid );
                right = mid;
                mid --;
            }
			else
			{
				left = max ( left , mid );
				mid ++;
			}
        if ( mid <= left || right <= mid ) break;
	}
    if ( pos > N ) return -1;
    return pos;
}

void read()
{
	scanf ( "%d %d" , &N , &nrQueries );
	for ( i = 1 ; i <= N ; i ++ )
	{
		scanf ( "%d" , &value );
		update ( i , value );
	}
	for ( i = 1 ; i <= nrQueries ; i++ )
	{
		scanf ( "%d " , &queryType );
		if ( queryType == 0 ) //update the value
		{
			scanf ( "%d %d" , &index , &value );
			update ( index , value );
		}
		else
			if ( queryType == 1 ) //determine sum of values
			{
				scanf ( "%d %d" , &left , &right );
				sum = detSum ( right ) - detSum ( left - 1 );
				printf ( "%d\n" , sum ) ;
			}
			else				  //determine index
			{
				scanf ( "%d" , &sum );
				printf ( "%d\n" , detIndex ( sum ) );
			}
	}
}

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