Pagini recente » Arhiva de probleme | Cod sursa (job #2750056) | Cod sursa (job #3284639) | Cod sursa (job #1932090) | Cod sursa (job #2387592)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
void updateAib(std::vector<int>& tree, int N, int pos, int val)
{
for (int i = pos; i <= N; i += (i & (-i))) {
tree[i] += val;
}
}
int queryAib(std::vector<int>& tree, int pos)
{
int sum = 0;
for (int i = pos; i; i -= (i & (-i))) {
sum += tree[i];
}
return sum;
}
int binSearch(std::vector<int>& tree, int N, int a)
{
int step, i;
for (step = 1; step < N; step <<= 1);
for (i = 0; step; step >>= 1) {
if (i + step <= N && tree[i+step] <= a) {
i += step;
a -= tree[i];
}
}
if (a == 0) {
return i;
}
return -1;
}
int main ()
{
std::ifstream in("aib.in");
int N, M;
in >> N >> M;
std::vector<int> tree(N+1);
for (int i = 1; i <= N; ++ i) {
int x;
in >> x;
updateAib(tree, N, i, x);
}
std::ofstream out("aib.out");
for (int i = 0; i < M; ++ i) {
char op;
int a, b;
in >> op;
if (op == '0') {
in >> a >> b;
updateAib(tree, N, a, b);
} else if (op == '1') {
in >> a >> b;
out << queryAib(tree, b) - queryAib(tree, a-1) << "\n";
} else if (op == '2') {
in >> a;
out << binSearch(tree, N, a) << "\n";
}
}
in.close();
out.close();
return 0;
}