Pagini recente » Cod sursa (job #2101779) | Cod sursa (job #673782) | Cod sursa (job #3219777) | Cod sursa (job #3260321) | Cod sursa (job #3283861)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 100003;
int n, q;
int v[NMAX];
int t[NMAX];
int lsb(int x) { return (x & (-x)); }
void add(int idx, int val) {
for(int i = idx; i <= n; i += lsb(i)) {
t[i] += val;
}
}
int get_sum(int x) {
int ans = 0;
for(int i = x; i >= 1; i -= lsb(i)) {
ans += t[i];
}
return ans;
}
int sum(int x, int y) {
return get_sum(y) - get_sum(x - 1);
}
int query(int x) {
int l = 1, r = n, last = -1;
while(r - l >= 0) {
int mid = (l + r) / 2, s = get_sum(mid);
if(s >= x) {
last = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
return (get_sum(last) == x ? last : -1);
}
int main() {
cin >> n >> q;
for(int i = 1; i <= n; i++) {
cin >> v[i];
add(i, v[i]);
}
while(q--) {
int type;
cin >> type;
if(type == 0) {
int x, y;
cin >> x >> y;
add(x, y);
} else if(type == 1) {
int x, y;
cin >> x >> y;
cout << sum(x, y) << '\n';
} else {
int x;
cin >> x;
cout << query(x) << '\n';
}
}
return 0;
}