Pagini recente » Cod sursa (job #3315732) | Cod sursa (job #245170) | Borderou de evaluare (job #1564118) | Cod sursa (job #1376183) | Cod sursa (job #3357906)
#include <iostream>
#include <fstream>
#include <vector>
int n;
std::vector<int> aib;
void update(int pos, int val) {
for (int i = pos; i <= n; i += i & -i) {
aib[i] += val;
}
}
int query(int pos) {
int sum = 0;
for (int i = pos; i > 0; i -= i & -i) {
sum += aib[i];
}
return sum;
}
int find(int val) {
int pos = 0;
int sum = 0;
for (int step = 1 << 17; step > 0; step >>= 1) {
if (pos + step <= n && sum + aib[pos + step] < val) {
pos += step;
sum += aib[pos];
}
}
if (sum + 1 == val) return pos + 1;
if (query(pos + 1) >= val) return pos + 1;
return -1;
}
int main() {
std::ifstream input("aib.in");
std::ofstream output("aib.out");
int m;
input >> n >> m;
aib.resize(n + 1, 0);
for (int i = 1; i <= n; ++i) {
int x;
input >> x;
update(i, x);
}
while (m--) {
int q;
input >> q;
if (q == 0) {
int a, b;
input >> a >> b;
update(a, b);
} else if (q == 1) {
int a, b;
input >> a >> b;
output << query(b) - query(a - 1) << '\n';
} else if (q == 2) {
int a;
input >> a;
int pos = find(a);
output << pos << '\n';
}
}
return 0;
}