Pagini recente » Cod sursa (job #2524692) | Cod sursa (job #2709662) | Cod sursa (job #623951) | Cod sursa (job #801336) | Cod sursa (job #1131169)
#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;
}
long bfind ( long left, long right, long s ) {
long middle, S;
if ( s < sum ( left ) || sum ( right ) < s )
return -1;
while ( left <= right ) {
middle = left + ( right - left ) / 2;
S = sum ( middle );
if ( S == s )
return middle;
else if ( s < S )
right = middle - 1;
else
left = middle + 1;
}
return -1;
}
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 );
printf ( "%ld\n", bfind ( 1, n, a ) );
}
}
return 0;
}