Pagini recente » Cod sursa (job #57322) | Cod sursa (job #1227090) | Cod sursa (job #750286) | Cod sursa (job #218585) | Cod sursa (job #2713557)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, m, v[100005], aib[100005];
int zero(int x) {
return ((x ^ (x - 1)) & x);
}
void add(int x, int quantity) {
for (int i = x; i <= n; i += zero(i)) aib[i] += quantity;
}
int query(int a) {
int rez = 0;
for (int i = a; i > 0; i -= zero(i)) rez += aib[i];
return rez;
}
void search(int val) {
int left = 1, right = n;
while (left <= right) {
int mid = (left + right) / 2;
if (query(mid) >= val) right = mid - 1;
else left = mid + 1;
}
if (query(right + 1) != val)
out << -1 << '\n';
else out << right + 1 << '\n';
}
int main() {
ios::sync_with_stdio(false);
in.tie(NULL), out.tie(NULL);
in >> n >> m;
for (int i = 1; i <= n; i++) {
in >> v[i];
for (int j = i - zero(i) + 1; j <= i; j++) aib[i] += v[j];
}
while (m--) {
int op, a, b;
in >> op;
if (op == 0) {
in >> a >> b;
add(a, b);
}
if (op == 1) {
in >> a >> b;
out << query(b) - query(a - 1) << '\n';
}
if (op == 2) {
in >> a;
search(a);
}
}
return 0;
}