Pagini recente » Cod sursa (job #517176) | Cod sursa (job #3036460) | Cod sursa (job #2156523) | Cod sursa (job #682660) | Cod sursa (job #2737656)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int lg = 30;
const int max_n = (int)1e5 + 5;
int n, m;
int bit[max_n];
int lsb(int x) {
return (x & (-x));
}
void add(int pos, int val) {
for (int i = pos; i <= n; i += lsb(i)) {
bit[i] += val;
}
}
int query(int pos) {
int ans = 0;
for (int i = pos; i > 0; i -= lsb(i)) {
ans += bit[i];
}
return ans;
}
int lift(int value) {
int ans = 0;
for (int step = (1 << lg); step > 0 && value > 0; step >>= 1) {
if (ans + step <= n && value >= bit[ans + step]) {
ans += step;
value -= bit[ans];
}
}
if (!value) {
return ans;
}
return -1;
/*int step = (1 << 30);
int ans = 0;
while (step > 0 && value > 0) {
if ((ans + step) <= n && bit[ans + step] <= value) {
ans += step;
value -= bit[ans];
if (value == 0) {
return ans;
}
}
step >>= 1;
}
return - 1;*/
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; i++) {
int val;
in >> val;
add(i, val);
}
for (int i = 1; i <= m; i++) {
int op, x, y;
in >> op >> x;
if (op == 0) {
in >> y;
add(x, y);
} else if (op == 1) {
in >> y;
out << query(y) - query(x - 1) << "\n";
} else if (op == 2) {
out << lift(x) << "\n";
}
}
return 0;
}