Pagini recente » Cod sursa (job #423857) | Cod sursa (job #352415) | Cod sursa (job #1799814) | Cod sursa (job #2858881) | Cod sursa (job #2611864)
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5;
const int dim = 1 << 17;
int v[N+1], AIB[N+1];
int f[N+1];
char next_ch (){
static int bp = dim;
static char buff[dim];
if ( bp == dim ){
bp = 0;
fread ( buff, 1, dim, stdin );
}
return buff[bp++];
}
int get () {
int a = 0, semn = 1;
char ch;
while ( isspace ( ch = next_ch () ) );
if ( ch == '-' )
semn = -1, ch = next_ch ();
do
a = a * 10 + ch - '0';
while ( isdigit ( ch = next_ch () ) );
return a * semn;
}
static inline int zeros ( int x ){
return ( ( x ^ ( x - 1 ) ) & x );
}
int q ( int poz ){
int s = 0;
for ( int i = poz; i > 0; i -= zeros ( i ) )
s += AIB[i];
return s;
}
void add ( int poz, int quantity, int n ){
for ( int i = poz; i <= n; i += zeros ( i ) )
AIB[i] += quantity;
}
int main()
{
freopen ( "aib.in", "r", stdin );
freopen ( "aib.out", "w", stdout );
ios_base::sync_with_stdio ( false );
cin.tie ( NULL );
cout.tie ( NULL );
int n, i, k;
int t, CASE;
n = get (), t = get ();
for ( i = 1; i <= n; i ++ )
v[i] = get (), f[i] = f[i-1] + v[i];
for ( i = 1; i <= n; i ++ ){
k = zeros ( i );
AIB[i] = f[i] - f[i-k];
}
for ( i = 1; i <= t; i ++ ) {
CASE = get ();
if ( CASE == 1 ){
int low = get (), high = get ();
cout << q ( high ) - q ( low - 1 ) << '\n';
}
else if ( CASE == 0 ) {
int poz = get (), quantity = get ();
add ( poz, quantity, n );
}
else {
int x = get ();
int st = 1, dr = n, poz = -1;
while ( st <= dr ) {
int mij = st + ( dr - st ) / 2;
if ( q ( mij ) == x )
poz = mij, dr = mij - 1;
else if ( q ( mij ) < x )
st = mij + 1;
else
dr = mij - 1;
}
cout << poz << '\n';
}
}
return 0;
}