# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
919887 | vjudge1 | Monkey and Apple-trees (IZhO12_apple) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
using namespace std;
// Segment tree node
struct Node {
int left, right; // interval [left, right]
int redApples; // number of red-ripen apple-trees in the interval
};
// Function to build the segment tree
void buildSegmentTree(vector<Node>& tree, int node, int left, int right) {
tree[node].left = left;
tree[node].right = right;
tree[node].redApples = 0;
if (left != right) {
int mid = (left + right) / 2;
buildSegmentTree(tree, 2 * node, left, mid);
buildSegmentTree(tree, 2 * node + 1, mid + 1, right);
}
}
// Function to update the segment tree with red-ripening of apples
void updateSegmentTree(vector<Node>& tree, int node, int left, int right) {
if (tree[node].left == left && tree[node].right == right) {
tree[node].redApples = right - left + 1;
} else {
int mid = (tree[node].left + tree[node].right) / 2;
if (right <= mid) {
updateSegmentTree(tree, 2 * node, left, right);
} else if (left > mid) {
updateSegmentTree(tree, 2 * node + 1, left, right);
} else {
updateSegmentTree(tree, 2 * node, left, mid);
updateSegmentTree(tree, 2 * node + 1, mid + 1, right);
}
tree[node].redApples = tree[2 * node].redApples + tree[2 * node + 1].redApples;
}
}
// Function to query the segment tree for the number of red-ripen apple-trees
int querySegmentTree(vector<Node>& tree, int node, int left, int right) {
if (tree[node].left == left && tree[node].right == right) {
return tree[node].redApples;
} else {
int mid = (tree[node].left + tree[node].right) / 2;
if (right <= mid) {
return querySegmentTree(tree, 2 * node, left, right);
} else if (left > mid) {
return querySegmentTree(tree, 2 * node + 1, left, right);
} else {
return querySegmentTree(tree, 2 * node, left, mid) + querySegmentTree(tree,