Pagini recente » Cod sursa (job #2442234) | Cod sursa (job #2203423) | Cod sursa (job #1591759) | Cod sursa (job #2602249) | Cod sursa (job #222522)
Cod sursa(job #222522)
#include <cstdio>
using namespace std;
int M, N, logN, T[100010];
void upd( int x, int y ) {
for( ; x <= N; x += x & -x )
T[x] += y;
}
int qu( int x ) {
int s = 0;
for( ; x; x -= x & -x )
s += T[x];
return s;
}
void que1( int x, int y ) {
printf( "%d\n", qu( y ) - qu( x-1 ) );
}
void que2( int x ) {
int step, sum, i;
for( step = logN, sum = i = 0; step; step >>= 1 ) {
if( sum + T[ i+step ] < x ) {
i += step; sum += T[i];
}
}
if( qu( i+1 ) == x )
printf( "%d\n", i+1 );
else
printf( "-1\n" );
}
int main() {
int i, x, op, a, b;
freopen( "aib.in", "r", stdin );
freopen( "aib.out", "w", stdout );
scanf( "%d%d", &N, &M );
for( logN = 1; logN <= N; logN <<= 1 );
logN >>= 1;
for( i = 1; i <= N; i++ ) {
scanf( "%d", &x );
upd( i, x );
}
while( M-- ) {
scanf( "%d%d", &op, &a );
switch( op ) {
case 0: scanf( "%d", &b ); upd( a, b ); break;
case 1: scanf( "%d", &b ); que1( a, b ); break;
case 2: que2( a ); break;
}
}
return 0;
}