Pagini recente » Cod sursa (job #3126530) | Monitorul de evaluare | Cod sursa (job #230616) | Cod sursa (job #3039810) | Cod sursa (job #3204742)
#include <iostream>
#include <fstream>
#include <vector>
#include <climits> // Added this line
using namespace std;
struct Node {
int min_value;
Node *left;
Node *right;
};
Node *build_segment_tree(vector<int> &array, int start, int end) {
if (start == end) {
Node *node = new Node;
node->min_value = array[start];
node->left = nullptr;
node->right = nullptr;
return node;
}
int mid = (start + end) / 2;
Node *left_node = build_segment_tree(array, start, mid);
Node *right_node = build_segment_tree(array, mid + 1, end);
Node *node = new Node;
node->min_value = min(left_node->min_value, right_node->min_value);
node->left = left_node;
node->right = right_node;
return node;
}
int query_segment_tree(Node *root, int start, int end, int x, int y) {
if (start > end || x > y) {
return INT_MAX;
}
if (start == x && end == y) {
return root->min_value;
}
int mid = (start + end) / 2;
int left_min = query_segment_tree(root->left, start, mid, x, min(y, mid));
int right_min = query_segment_tree(root->right, mid + 1, end, max(x, mid + 1), y);
return min(left_min, right_min);
}
int main() {
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, m;
in >> n >> m;
vector<int> array(n);
for (int i = 0; i < n; i++) {
in >> array[i];
}
Node *root = build_segment_tree(array, 0, n - 1);
for (int i = 0; i < m; i++) {
int x, y;
in >> x >> y;
x--;
y--;
int min_value = query_segment_tree(root, 0, n - 1, x, y);
out << min_value << endl;
}
in.close();
out.close();
return 0;
}