Pagini recente » Cod sursa (job #3271471) | Cod sursa (job #2012454) | Cod sursa (job #3316546) | Cod sursa (job #181949) | Cod sursa (job #3330548)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
vector<int> a, lg;
vector<vector<int>> M;
int n, m;
void read() {
fin >> n >> m;
a = lg = vector<int>(n + 1);
for (int i = 1; i <= n; i++)
fin >> a[i];
int K = 0;
while ((1 << K) <= n) K++;
M = vector<vector<int>>(K, vector<int>(n + 1));
for (int i = 1; i <= n; ++i)
M[0][i] = a[i];
for (int k = 1; k < K; ++k) {
for (int i = 1; i + (1 << k) - 1 <= n; ++i) {
int j = i + (1 << (k - 1));
M[k][i] = min(M[k - 1][i], M[k - 1][j]);
}
}
}
int query(int x, int y) {
int len = y - x + 1;
int k = lg[len];
return min(M[k][x], M[k][y - (1 << k) + 1]);
}
void solve() {
read();
lg[1] = 0;
for (int i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
int x, y;
while (m--) {
fin >> x >> y;
fout << query(x, y) << '\n';
}
}
int main() {
solve();
return 0;
}