Pagini recente » Cod sursa (job #615345) | Cod sursa (job #1101732) | Cod sursa (job #2257658) | Cod sursa (job #1497918) | Cod sursa (job #1264367)
#include<fstream>
using namespace std;
ifstream fin( "aib.in" );
ofstream fout( "aib.out" );
const int nmax = 100000;
int n, aib[ nmax + 1 ];
inline int lsb( int x ) {
return ( x & -x );
}
void update( int pos, int val ) {
for( int i = pos; i <= n; i += lsb( i ) ) {
aib[ i ] += val;
}
}
int query1( int pos ) {
int ans = 0;
for( int i = pos; i > 0; i -= lsb( i ) ) {
ans += aib[ i ];
}
return ans;
}
int query2( int k ) {
int sol, sc;
sol = sc = 0;
for( int step = 1 << 17; step > 0; step >>= 1 ) {
if ( sol + step <= n && sc + aib[ sol + step ] <= k ) {
sol += step;
sc += aib[ sol ];
}
}
if ( sc != k || sol == 0 ) {
return -1;
}
return sol;
}
int main() {
int m, x, y, t;
fin >> n >> m;
for( int i = 1; i <= n; ++ i ) {
fin >> x;
update( i, x );
}
while ( m -- ) {
fin >> t >> x;
if ( t < 2 ) {
fin >> y;
if ( t == 0 ) {
update( x, y );
} else {
fout << query1( y ) - query1( x - 1 ) << "\n";
}
} else {
fout << query2( x ) << "\n";
}
}
fin.close();
fout.close();
return 0;
}