Pagini recente » Cod sursa (job #2771347) | Cod sursa (job #2560387) | Cod sursa (job #769410) | Cod sursa (job #840088) | Cod sursa (job #759757)
Cod sursa(job #759757)
#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( ( 1 << doi ) <= 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;
}