Pagini recente » Cod sursa (job #2717118) | Cod sursa (job #2796935) | oni15_z2 | Cod sursa (job #1550311) | Cod sursa (job #3297317)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define int unsigned
signed main() {
FILE *fin = fopen( "aib.in", "r" );
FILE *fout = fopen( "aib.out", "w" );
int n, m;
fscanf( fin, "%d%d", &n, &m );
std::vector<int> v(n);
for( int i = 0; i < n; i++ )
fscanf( fin, "%d", &v[i] );
std::vector<int> aib(n + 1, 0);
for( int i = 1; i <= n; i++ ){
int x = v[i - 1];
for( int ii = i; ii <= n; ii += (ii & -ii) )
aib[ii] += x;
}
for( int i = 0; i < m; i++ ){
int task;
fscanf( fin, "%d", &task );
if( task == 0 ){
int idx, delta;
fscanf( fin, "%d%d", &idx, &delta );
for( int ii = idx; ii <= n; ii += (ii & -ii) )
aib[ii] += delta;
}else if( task == 1 ){
int st, dr;
fscanf( fin, "%d%d", &st, &dr );
st--;
int ret = 0;
for( int ii = st; ii; ii &= (ii - 1) )
ret -= aib[ii];
for( int ii = dr; ii; ii &= (ii - 1) )
ret += aib[ii];
fprintf( fout, "%d\n", ret );
}else{
int x;
fscanf( fin, "%d", &x );
int idx = 0;
for( int p2 = (1 << 19); p2; p2 >>= 1 )
if( idx + p2 <= n && aib[idx + p2] <= x ){
idx += p2;
x -= aib[idx];
}
fprintf( fout, "%d\n", x == 0 ? (idx) : -1 );
}
}
fclose( fin );
fclose( fout );
return 0;
}