Pagini recente » Borderou de evaluare (job #1569246) | Cod sursa (job #3032183) | Cod sursa (job #127100) | Cod sursa (job #3286379) | Cod sursa (job #1548227)
#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;
}