Pagini recente » Borderou de evaluare (job #1796364) | Arhiva Educationala | Borderou de evaluare (job #713124) | Borderou de evaluare (job #3226502) | Cod sursa (job #759756)
Cod sursa(job #759756)
#include <fstream>
#define nMAX 1 << 14
using namespace std;
int n, m;
int v[ nMAX ], s[ nMAX ];
ofstream decenumergewritesemnuintrebariisadface( "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 )
{
decenumergewritesemnuintrebariisadface << 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 )
{
decenumergewritesemnuintrebariisadface << 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;
}