Pagini recente » Cod sursa (job #375201) | Cod sursa (job #1798715) | Cod sursa (job #586838) | Cod sursa (job #2593496) | Cod sursa (job #1264190)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 100000;
int aib[NMAX+2];
int N,Q;
inline int LSB( int nr ) {
return ( nr & (-nr) );
}
void Update_aib( int poz, int val ) {
for( int i= poz; i<=N; i+= LSB(i) ) {
aib[i]+= val;
}
}
int Querry_aib( int poz ) {
int ans= 0;
for( int i= poz; i>0; i-= LSB(i) ) {
ans+= aib[i];
}
return ans;
}
int Bin_search_sum( int val ) {
int last= -1, st= 1, dr= N, mid= (st+dr)/2;
while( st <= dr ) {
mid= (st+dr)/2;
int Qry= Querry_aib( mid );
if( Qry <= val ) {
last= Qry;
st= mid + 1;
if( last == val ) break;
}
else {
dr= mid - 1;
}
}
if( last == val ) return mid;
return -1;
}
int main() {
in >> N >> Q;
for( int i= 1; i<=N; ++i ) {
int a;
in >> a;
Update_aib( i, a );
}
for( int i= 1; i<=Q; ++i ) {
int op, x,y,p;
in >> op;
if( op == 0 ) { /// O( log2(N) )
in >> p >> x;
Update_aib( p, x );
}
if( op == 1 ) { /// O( log2(N) )
in >> x >> y;
out << Querry_aib( y ) - Querry_aib( x-1 ) << '\n';
}
if( op == 2 ) { /// O( log2(N) )
in >> x;
out << Bin_search_sum( x ) << '\n';
}
}
return 0;
}