Pagini recente » Cod sursa (job #2879794) | Cod sursa (job #2863171) | Cod sursa (job #2957747) | Cod sursa (job #3227100) | Cod sursa (job #3283862)
#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() {
ifstream in("aib.in");
ofstream out("aib.out");
in >> n >> q;
for(int i = 1; i <= n; i++) {
in >> v[i];
add(i, v[i]);
}
while(q--) {
int type;
in >> type;
if(type == 0) {
int x, y;
in >> x >> y;
add(x, y);
} else if(type == 1) {
int x, y;
in >> x >> y;
out << sum(x, y) << '\n';
} else {
int x;
in >> x;
out << query(x) << '\n';
}
}
return 0;
}