Pagini recente » Cod sursa (job #1765341) | Cod sursa (job #812498) | Cod sursa (job #2218624) | Cod sursa (job #2087389) | Cod sursa (job #2574612)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int MAX_N = 1e5 + 5;
int m, n;
int bit[MAX_N];
int lsb(int x) {
return (x & (- x));
}
void update(int pos, int value) {
int p;
p = pos;
while (p <= n) {
bit[p] += value;
p += lsb(p);
}
}
int query(int pos) {
int p, ans;
p = pos;
ans = 0;
while (p > 0) {
ans += bit[p];
p -= lsb(p);
}
return ans;
}
int bin(int value) {
int ans, step, sum;
ans = sum = 0;
step = (1 << (1 + int(log2(n))));
while (step > 0 && value > 0) {
if (step + ans <= n && bit[step + ans] <= value) {
ans += step;
value -= bit[ans];
}
if (value == 0) {
return ans;
}
step >>= 1;
}
return - 1;
}
int main() {
int op, a, b;
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
fin >> a;
update(i, a);
}
while (m --) {
fin >> op >> a;
if (op == 0) {
fin >> b;
update(a, b);
} else if (op == 1) {
fin >> b;
fout << query(b) - query(a - 1) << "\n";
} else {
fout << bin(a) << "\n";
}
}
return 0;
}