Pagini recente » Cod sursa (job #2360788) | Cod sursa (job #3232999) | Cod sursa (job #3287000) | Cod sursa (job #2442710) | Cod sursa (job #615276)
Cod sursa(job #615276)
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
using namespace std;
int N;
int v[N_MAX];
inline int Log2( int x ) { return 31-__builtin_clz(x); }
void Update( int xIndex, int xValue )
{
for( ; xIndex <= N; xIndex+=( xIndex & -xIndex ) )
v[xIndex]+=xValue;
}
int Sum( int xIndex )
{
int sum;
for( sum=0; xIndex; xIndex-=( xIndex & -xIndex ) )
sum+=v[xIndex];
return sum;
}
int Query( int idx, int k )
{
for( int tidx, i=0; idx; idx>>=1 )
{
tidx=idx+i;
if( tidx <= N )
{
if( v[tidx] > k )
continue;
if( k == v[tidx] )
return tidx;
k-=v[tidx];
i=tidx;
}
}
return -1;
}
int main( void )
{
int M, i, x, op, a, b, idx;
ifstream in( "aib.in" );
in>>N>>M;
idx=1<<Log2(N);
for( i=1; i <= N; ++i )
{
in>>x;
Update( i, x );
}
ofstream out( "aib.out" );
for( ; M; --M )
{
in>>op;
switch( op )
{
case 0 : in>>a>>b; Update( a, b ); break;
case 1 : in>>a>>b; out<<( Sum(b)-Sum(a-1) )<<'\n'; break;
case 2 : in>>a; out<<Query(idx, a)<<'\n';
}
}
return EXIT_SUCCESS;
}