Pagini recente » Cod sursa (job #2951093) | Cod sursa (job #3215221) | Cod sursa (job #3258922) | Cod sursa (job #3242432) | Cod sursa (job #3297473)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define int long long
int range_sum( const std::vector<int> &aib, int st, int dr ) {
int ret = 0;
st--;
for( int ii = st; ii; ii &= (ii - 1) )
ret -= aib[ii];
for( int ii = dr; ii; ii &= (ii - 1) )
ret += aib[ii];
return ret;
}
signed main() {
FILE *fin = fopen( "aib.in", "r" );
FILE *fout = fopen( "aib.out", "w" );
int n, m;
fscanf( fin, "%lld%lld", &n, &m );
std::vector<int> v(n);
for( int i = 0; i < n; i++ )
fscanf( fin, "%lld", &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, "%lld", &task );
if( task == 0 ){
int idx, delta;
fscanf( fin, "%lld%lld", &idx, &delta );
for( int ii = idx; ii <= n; ii += (ii & -ii) )
aib[ii] += delta;
}else if( task == 1 ){
int st, dr;
fscanf( fin, "%lld%lld", &st, &dr );
fprintf( fout, "%lld\n", range_sum( aib, st, dr ) );
}else{
int x;
fscanf( fin, "%lld", &x );
int idx = 0;
for( int p2 = (1 << 19); p2; p2 >>= 1 )
if( idx + p2 <= n && range_sum( aib, 1, idx + p2 ) < x )
idx += p2;
idx++;
if( range_sum( aib, 1, idx ) == x )
fprintf( fout, "%lld\n", idx );
else
fprintf( fout, "-1\n" );
}
}
fclose( fin );
fclose( fout );
return 0;
}