Pagini recente » Cod sursa (job #455019) | Cod sursa (job #607188) | Cod sursa (job #2272626) | Cod sursa (job #2872711) | Cod sursa (job #3233244)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <climits>
using namespace std;
class SegmentTree {
vector<int> tree;
int size;
public:
SegmentTree(const vector<int>& data) {
size = data.size();
tree.resize(4 * size);
buildTree(data, 0, size - 1, 0);
}
void buildTree(const vector<int>& data, int start, int end, int node) {
if (start == end) {
tree[node] = data[start];
} else {
int mid = start + (end - start) / 2;
buildTree(data, start, mid, 2 * node + 1);
buildTree(data, mid + 1, end, 2 * node + 2);
tree[node] = min(tree[2 * node + 1], tree[2 * node + 2]);
}
}
int query(int qs, int qe, int ss, int se, int node) {
if (qs <= ss && qe >= se) {
return tree[node];
}
if (qs > se || qe < ss) {
return INT_MAX;
}
int mid = ss + (se - ss) / 2;
return min(query(qs, qe, ss, mid, 2 * node + 1), query(qs, qe, mid + 1, se, 2 * node + 2));
}
int query(int left, int right) {
return query(left, right, 0, size - 1, 0);
}
};
int main() {
ifstream infile("rmq.in");
ofstream outfile("rmq.out");
int N, M;
infile >> N >> M;
vector<int> A(N);
for (int i = 0; i < N; ++i) {
infile >> A[i];
}
SegmentTree segmentTree(A);
for (int i = 0; i < M; ++i) {
int x, y;
infile >> x >> y;
outfile << segmentTree.query(x - 1, y - 1) << "\n";
}
infile.close();
outfile.close();
return 0;
}