Pagini recente » Cod sursa (job #3295673) | Cod sursa (job #1542814) | Cod sursa (job #1454900) | Cod sursa (job #3293880) | Cod sursa (job #2812770)
#include <bits/stdc++.h>
std::ifstream in("aib.in");
std::ofstream out("aib.out");
inline int lsb(int x) {
return x & (-x);
}
inline int log2(int x) {
return 31 - __builtin_clz(x);
}
const int N = 1e5;
int n;
struct Fwt {
int v[N + 1];
void update(int i, int d) {
++i;
for (; i <= n; i += lsb(i)) {
v[i] += d;
}
}
int query_prefix(int i) {
++i;
int q = 0;
for (; i != 0; i -= lsb(i)) {
q += v[i];
}
return q;
}
int query_range(int l, int r) {
return query_prefix(r) - query_prefix(l - 1);
}
int query_k_sum(int k) {
int p2 = 1 << log2(n);
int i = 0;
while (p2 != 0 && k != 0) {
if (i + p2 <= n && v[i + p2] <= k) {
k -= v[i + p2];
i += p2;
}
p2 /= 2;
}
return (k == 0 && i != 0) ? i : -1;
}
} fwt;
int main() {
int q;
in >> n >> q;
for (int i = 0; i < n; ++i) {
int x;
in >> x;
fwt.update(i, x);
}
for (int i = 0; i < q; ++i) {
int query;
in >> query;
switch (query) {
case 0: {
int i, x;
in >> i >> x;
--i;
fwt.update(i, x);
break;
}
case 1: {
int i, j;
in >> i >> j;
--i, --j;
out << fwt.query_range(i, j) << '\n';
break;
}
case 2: {
int k;
in >> k;
out << fwt.query_k_sum(k) << '\n';
break;
}
}
}
}