Pagini recente » Cod sursa (job #1816626) | Cod sursa (job #2874497) | Cod sursa (job #2714102) | Cod sursa (job #1249227) | Cod sursa (job #2786527)
#include <fstream>
using namespace std;
unsigned int aib[100001], 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");
unsigned int m, i, p, a, b, poz, put, cop, sum;
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;
while( put != 0 ) {
if( ( poz | put ) <= n && sum + aib[poz|put] <= a ) {
poz |= put;
sum += aib[poz];
}
put >>= 1;
}
cout<<poz<<"\n";
}
}
return 0;
}