Pagini recente » Cod sursa (job #589654) | Cod sursa (job #580704) | Cod sursa (job #519152) | Cod sursa (job #2553127) | Cod sursa (job #3134186)
#include <iostream>
#include <fstream>
#include <vector>
#include <limits>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
vector<int> segmentTree;
void buildSegmentTree(const vector<int>& arr, int node, int start, int end) {
if (start == end) {
segmentTree[node] = arr[start];
} else {
int mid = (start + end) / 2;
buildSegmentTree(arr, 2 * node, start, mid);
buildSegmentTree(arr, 2 * node + 1, mid + 1, end);
segmentTree[node] = min(segmentTree[2 * node], segmentTree[2 * node + 1]);
}
}
int querySegmentTree(int node, int start, int end, int left, int right) {
if (right < start || left > end) {
return numeric_limits<int>::max();
}
if (left <= start && right >= end) {
return segmentTree[node];
}
int mid = (start + end) / 2;
int leftMin = querySegmentTree(2 * node, start, mid, left, right);
int rightMin = querySegmentTree(2 * node + 1, mid + 1, end, left, right);
return min(leftMin, rightMin);
}
int main() {
int n, m;
fin >> n >> m;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
fin >> arr[i];
}
segmentTree.resize(4 * n);
buildSegmentTree(arr, 1, 0, n - 1);
for (int i = 0; i < m; i++) {
int x, y;
fin >> x >> y;
int minValue = querySegmentTree(1, 0, n - 1, x - 1, y - 1);
fout << minValue << '\n';
}
fin.close();
fout.close();
return 0;
}