Pagini recente » Monitorul de evaluare | Cod sursa (job #3336857) | Cod sursa (job #823844) | Cod sursa (job #2360697) | Cod sursa (job #582232)
Cod sursa(job #582232)
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
using namespace std;
int aib[N_MAX];
void Update( int x, const int& y, const int& N )
{
for( ; x <= N; x+=( x & -x ) )
aib[x]+=y;
}
int Sum( int x )
{
int sum=0;
for( ; x; x-=( x & -x ) )
sum+=aib[x];
return sum;
}
inline int log2( int N ) { return 31-__builtin_clz(N); }
int Query( int log2N, int S, const int& N )
{
int tidx, idx;
for( idx=0; log2N; log2N>>=1 )
{
tidx=log2N+idx;
if( tidx <= N )
{
if( S < aib[tidx] )
continue;
S-=aib[tidx];
if( 0 == S )
return tidx;
idx=tidx;
}
}
return -1;
}
int main( void )
{
int N, logN, M, op, i, x;
ifstream in( "aib.in" );
in>>N>>M;
for( i=1; i <= N; ++i )
{
in>>x;
Update( i, x, N );
}
logN=1<<log2(N);
ofstream out( "aib.out" );
for( ; M; --M )
{
in>>op;
switch(op)
{
case 0 : in>>i>>x; Update( i, x, N ); break;
case 1 : in>>i>>x; out<<( Sum(x)-Sum(i-1) )<<'\n'; break;
case 2 : in>>i; out<<Query( logN, i, N )<<'\n';
}
}
return EXIT_SUCCESS;
}