Pagini recente » Cod sursa (job #1897630) | Cod sursa (job #2945566) | Cod sursa (job #1749438) | Cod sursa (job #1183037) | Cod sursa (job #1131130)
#include <cstdio>
#define NMax 100005
using namespace std;
long aib[NMax], n, m, a, b, bl, x;
void add ( long poz, long val ) {
while ( poz < NMax ) {
aib[poz] += val;
poz += poz & ( -poz );
}
}
long sum ( long poz ) {
long sum = 0;
while ( poz ) {
sum += aib[poz];
poz -= poz & ( -poz );
}
return sum;
}
int main ( )
{
freopen ( "aib.in", "r", stdin );
freopen ( "aib.out", "w", stdout );
scanf ( "%ld %ld", &n, &m );
for ( long i = 1; i <= n; i++ ) {
scanf ( "%ld", &x );
add ( i, x );
}
for ( long i = 1; i <= m; i++ ) {
scanf ( "%ld", &bl );
if ( bl < 2 ) {
scanf ( "%ld %ld", &a, &b );
if ( bl == 0 )
add ( a, b );
else
printf ( "%ld\n", sum ( b ) - sum ( a - 1 ) );
}
else {
scanf ( "%ld", &a );
long ia = 1, ib = n, middle, returnVal = 0, S;
while ( !returnVal ) {
middle = ia + ( ib - ia ) / 2;
S = sum ( middle );
if ( middle == ia && S != a)
returnVal = -1;
else if ( a < S )
ib = middle;
else if ( a == S )
returnVal = middle;
else
ia = middle;
}
printf ( "%ld\n", returnVal );
}
}
return 0;
}