Pagini recente » Cod sursa (job #10343) | Cod sursa (job #2866266) | Cod sursa (job #66231) | Cod sursa (job #11100) | Cod sursa (job #3134386)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M;
vector<int> A;
void buildSegmentTree(vector<int>& segTree, int node, int start, int end) {
if (start == end) {
segTree[node] = A[start];
return;
}
int mid = (start + end) / 2;
buildSegmentTree(segTree, 2 * node, start, mid);
buildSegmentTree(segTree, 2 * node + 1, mid + 1, end);
segTree[node] = min(segTree[2 * node], segTree[2 * node + 1]);
}
// Găsește elementul minim într-un interval dat
int query(vector<int>& segTree, int node, int start, int end, int left, int right) {
if (left > end || right < start)
return INT_MAX;
if (left <= start && right >= end)
return segTree[node];
int mid = (start + end) / 2;
int leftMin = query(segTree, 2 * node, start, mid, left, right);
int rightMin = query(segTree, 2 * node + 1, mid + 1, end, left, right);
return min(leftMin, rightMin);
}
int main() {
fin >> N >> M;
A.resize(N);
for (int i = 0; i < N; i++)
fin >> A[i];
int segTreeSize = 4 * N;
vector<int> segTree(segTreeSize);
buildSegmentTree(segTree, 1, 0, N - 1);
for (int i = 0; i < M; i++) {
int x, y;
fin >> x >> y;
int result = query(segTree, 1, 0, N - 1, x - 1, y - 1);
fout << result << endl;
}
return 0;
}