Pagini recente » Cod sursa (job #2073817) | Cod sursa (job #368136) | Cod sursa (job #2218348) | Cod sursa (job #2811409) | Cod sursa (job #2866437)
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int N = 1e5 + 1;
inline int g(int x) {
return x - (x & -x);
}
inline int h(int x) {
return x + (x & -x);
}
inline int flog2(int x) {
return (x != 0) * (31 - __builtin_clz(x));
}
int n;
int v[N];
namespace fwt {
void add(int idx, int delta) {
for (int i = idx; i <= n; i = h(i)) {
v[i] += delta;
}
}
int prefix_sum(int idx) {
int rs = 0;
while (idx > 0) {
rs += v[idx];
idx = g(idx);
}
return rs;
}
inline int sum(int l, int r) {
return prefix_sum(r) - prefix_sum(l - 1);
}
int op2(int s) {
int idx = 0;
int step = 1 << flog2(n);
while (step > 0 && s > 0) {
if (idx + step <= n && v[idx + step] <= s) {
idx += step;
s -= v[idx];
}
step >>= 1;
}
return (s == 0 && idx != 0) ? idx : -1;
}
};
int main() {
int m;
in >> n >> m;
for (int i = 1; i <= n; ++i) {
int x;
in >> x;
fwt::add(i, x);
}
while (m--) {
int op;
in >> op;
int a, b;
switch (op) {
case 0:
in >> a >> b;
fwt::add(a, b);
break;
case 1:
in >> a >> b;
out << fwt::sum(a, b) << '\n';
break;
case 2:
in >> a;
out << fwt::op2(a) << '\n';
}
}
}