Pagini recente » Cod sursa (job #2810266) | Cod sursa (job #3168606) | Cod sursa (job #3321326) | Cod sursa (job #2135645) | Cod sursa (job #3312547)
#include <bits/stdc++.h>
using namespace std;
struct FenTree {
int n;
vector<int> arr;
FenTree(int n_) : n(n_), arr(n + 1, 0) {}
void put(int i, int x) {
for (; i <= n; i += i & -i) {
arr[i] += x;
}
}
int get(int i) {
int x = 0;
for (; i > 0; i -= i & -i) {
x += arr[i];
}
return x;
}
int src(int X) {
int i = 0;
int x = 0;
for (int p = std::bit_floor((uint32_t)n); p; p >>= 1) {
if (i + p <= n && x + arr[i + p] < X) {
x += arr[i += p];
}
}
++i;
if (i > n || get(i) != X) {
return -1;
}
return i;
}
};
int main() {
#ifndef LOCAL
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
int M;
scanf("%d %d", &N, &M);
vector<int> arr(N + 1);
for (int i = 1; i <= N; ++i) {
scanf("%d", &arr[i]);
}
FenTree T(N);
for (int i = 1; i <= N; ++i) {
T.put(i, arr[i]);
}
for (; M--;) {
int o;
scanf("%d", &o);
if (o == 2) {
int X;
scanf("%d", &X);
printf("%d\n", T.src(X));
} else {
int a;
int b;
scanf("%d %d", &a, &b);
if (o == 1) {
printf("%d\n", T.get(b) - T.get(a - 1));
} else {
T.put(a, b);
}
}
}
return 0;
}