Pagini recente » Cod sursa (job #3124479) | Cod sursa (job #906804) | Cod sursa (job #482571) | Cod sursa (job #432488) | Cod sursa (job #2273600)
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100000 + 5;
int n, q;
int aib[N];
inline void add(int poz, int x) {
for (int i = poz; i <= n; i += i & (-i)) {
aib[i] += x;
}
}
inline int prefix(int poz) {
int ans = 0;
for (int i = poz; i >= 1; i -= i & (-i)) {
ans += aib[i];
}
return ans;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
add(i, x);
}
while (q--) {
int type;
cin >> type;
if (type == 0) {
int a, b;
cin >> a >> b;
add(a, b);
}
if (type == 1) {
int a, b;
cin >> a >> b;
cout << prefix(b) - prefix(a - 1) << "\n";
}
if (type == 2) {
int x;
cin >> x;
int cur = 0;
int r = 0, pas = (1 << 17);
while (pas) {
if (r + pas <= n && cur + aib[r + pas] < x) {
r += pas;
}
pas /= 2;
}
r++;
if (1 <= r && r <= n && prefix(r) == x) {
cout << r << "\n";
}
else {
cout << "-1\n";
}
}
}
}