Pagini recente » Cod sursa (job #2533320) | Cod sursa (job #2530580) | Cod sursa (job #3160496) | Cod sursa (job #531996) | Cod sursa (job #3248307)
#include <stdio.h>
#include <fstream>
using namespace std;
#define MAXN 100000
int n;
int v[MAXN + 1];
void update( int poz, int val ) {
int c = 0;
while ( poz <= n ) {
v[poz] += val;
while ( !(poz & (1<<c)) )
c++;
poz += (1<<c);
c++;
}
}
int query( int poz ) {
int c = 0, s = 0;
while ( poz > 0 ) {
s += v[poz];
while ( !(poz & (1<<c)) )
c++;
poz -= (1<<c);
c++;
}
return s;
}
int cautare( int sum )
{
int pos = n+1, b, c, s;
int limst=0, limdr=n+1;
b = n;
s = query( b );
if ( s == sum )
pos = n;
while ( b ) {
b = ( limst + limdr )>>1;
s = query( b );
if ( s > sum ) {
if ( limdr > b )
limdr = b;
b--;
}
else if ( s == sum ) {
pos = min( pos, b );
limdr = b;
b--;
}
else
{
if ( limst < b )
limst = b;
b++;
}
if ( b <= limst ) break;
if ( b >= limdr ) break;
}
if ( pos == n+1 )
return -1;
return pos;
}
int main()
{
ifstream fin( "aib.in" );
ofstream fout( "aib.out" );
int k, i, t, x, y, m;
fin >> n >> m;
for ( i = 1; i <= n; i++ ) {
fin >> t;
update(i,t);
}
for ( i = 0; i < m; i++ ) {
fin >> k;
if ( k < 2 ) {
fin >> x >> y;
if ( k == 0 )
update(x, y);
else
fout << query(y) - query(x-1) << '\n';
}
else {
fin >> x;
fout << cautare( x ) << '\n';
}
}
return 0;
}