Pagini recente » Cod sursa (job #817114) | Cod sursa (job #2647772) | Monitorul de evaluare | Cod sursa (job #1466427) | Cod sursa (job #1418844)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MX = 4*1e5+1;
int M[MX], A[MX], n, m;
void build(int node, int b, int e) {
if (b == e) {
M[node] = A[b];
}
else {
build(2*node, b, (b+e)/2);
build(2*node+1, (b+e)/2+1, e);
M[node] = min(M[2*node], M[2*node+1]);
}
}
int query(int node, int b, int e, int i, int j) {
if (i > e || j < b) {
return -1;
}
if (i <= b && e <= j) {
return M[node];
}
int l, r;
l = query(2*node, b, (b+e)/2, i, j);
r = query(2*node+1, (b+e)/2+1, e, i, j);
if (l == -1) return r;
if (r == -1) return l;
return min(l, r);
}
int main() {
ifstream in("rmq.in");
ofstream out("rmq.out");
in >> n >> m;
for (int i = 0; i < n; i++) {
in >> A[i];
}
build(1, 0, n-1);
int x, y;
for (int i = 0; i < m; i++) {
in >> x >> y;
out << query(1, 0, n-1, x-1, y-1) << '\n';
}
return 0;
}