Pagini recente » Cod sursa (job #1724040) | Cod sursa (job #19085) | Cod sursa (job #653591) | Cod sursa (job #1383631) | Cod sursa (job #2786540)
#include <fstream>
using namespace std;
int aib[200001], n;
void update( int poz, int val ) {
while( poz <= n ) {
aib[poz] += val;
poz = poz + ( poz & (-poz) );
}
return;
}
int findSum( int dr ) {
int s = 0;
while( dr ) {
s += aib[dr];
dr -=( dr & (-dr) );
}
return s;
}
int query( int st, int dr ) {
return findSum( dr ) - findSum( st - 1 );
}
int main() {
ifstream cin("aib.in");
ofstream cout("aib.out");
int m, i, p, a, b, poz, put, cop, sum, last;
cin>>n>>m;
for( i = 1; i <= n; i++ ) {
cin>>a;
update( i, a );
}
put = 1;
while( put <= n )
put *= 2;
put /= 2;
cop = put;
for( i = 1; i <= m; i++ ) {
cin>>p;
cin>>a;
if( p == 0 ) {
cin>>b;
update( a, b );
} else if( p == 1 ) {
cin>>b;
cout<<query( a, b )<<"\n";
} else {
poz = 0;
put = cop;
sum = 0;
last = -1;
while( put != 0 ) {
if( sum + aib[poz|put] <= a ) {
poz |= put;
sum += aib[poz];
}
if( sum == a )
last = poz;
put >>= 1;
}
cout<<last<<"\n";
}
}
return 0;
}