Pagini recente » Cod sursa (job #123782) | Cod sursa (job #1192844) | Cod sursa (job #1724585) | Cod sursa (job #1239702) | Cod sursa (job #2279862)
#include <cstdio>
int n, aib[150005];
using namespace std;
void update( int p, int val ) {
while(p <= n) {
aib[p] += val;
p += p&-p;
}
}
int query( int p ) {
int s = 0;
while( p > 0 ) {
s = s + aib[p];
p -= p&-p;
}
return s;
}
int cb( int val ) {
int i, pas;
pas = 1 << n;
for( i = 0; pas > 0; pas /= 2 ) {
if( i + pas <= n && aib[i+pas] <= val ) {
i += pas;
val -= aib[i];
if( val == 0 )
return i;
}
}
return -1;
}
int main() {
freopen( "aib.in", "r", stdin );
freopen( "aib.out", "w", stdout );
int m, t, a, b, i;
scanf( "%d%d", &n, &m );
for( i = 1; i <= n; i ++ ) {
scanf( "%d", &a );
update(i,a);
}
for( i = 1; i <= m; i ++ ) {
scanf( "%d", &t );
if( t == 0 ) {
scanf( "%d%d", &a, &b );
update(a,b);
}
else
if( t == 1 ) {
scanf( "%d%d", &a, &b );
printf( "%d\n", query(b) - query(a-1) );
}
else {
scanf( "%d", &a );
printf( "%d\n", cb(a) );
}
}
return 0;
}