Pagini recente » Cod sursa (job #1651924) | Cod sursa (job #2174387) | Cod sursa (job #2764645) | Cod sursa (job #3160692) | Cod sursa (job #1232949)
#include <fstream>
#include <iostream>
#define MAXN 100001
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, s, aib[MAXN];
void update(int pos, int val) {
int c = 0;
while(pos <= n) {
aib[pos] += val;
while( !(pos & (1 << c)) ) c++;
pos += (1 << c);
c++;
}
}
int query(int pos) {
int c = 0, s = 0;
while(pos > 0) {
s += aib[pos];
while( !(pos & (1 << c)) ) c++;
pos -= (1 << c);
c++;
}
return s;
}
int search(int sum) {
int pos = n+1, B = n;
int limst = 0, limdr = n + 1;
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() {
int val, code, x, y;
f >> n >> m;
for(int i = 1; i <= n; ++i) {
f >> val;
update(i, val);
}
while( m-- ) {
f >> code;
if(code == 0) {
f >> x >> val;
update(x, val);
} else if (code == 1) {
f >> x >> y;
g << query(y) - query(x - 1) << "\n";
} else {
f >> x;
g << search(x) << "\n";
}
}
}