Pagini recente » Cod sursa (job #2541882) | Cod sursa (job #499969) | Cod sursa (job #2317216) | Cod sursa (job #3183396) | Cod sursa (job #1901023)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, m, bit[100001];
const int L = 1 << 17;
void update(int idx, int val) {
while (idx <= n) {
bit[idx] += val;
idx += idx & (-idx);
}
}
int query(int idx) {
int sum = 0;
while (idx) {
sum += bit[idx];
idx -= idx & (-idx);
}
return sum;
}
int search(int val) {
int step = L;
int i = 0;
while (step) {
if (i + step <= n && bit[i + step] <= val) {
i += step;
val -= bit[i];
if (val == 0) return i;
}
step /= 2;
}
}
int main() {
in >> n >> m;
for (int i = 1, x; i <= n; ++i) {
in >> x;
update(i, x);
}
for (int i = 1, o, a, b; i <= m; ++i) {
in >> o >> a;
if (o == 0) {
in >> b;
update(a, b);
} else if (o == 1) {
in >> b;
out << query(b) - query(a - 1) << '\n';
} else {
int r = search(a);
if (!r) out << -1 << '\n'; else out << r << '\n';
}
}
return 0;
}