Pagini recente » Cod sursa (job #605570) | Cod sursa (job #79025) | Rezultatele filtrării | Borderou de evaluare (job #2012316) | Cod sursa (job #3301616)
#include <bits/stdc++.h>
using namespace std;
pair <int, int> dp[20][100005];
int v[100005];
int lg[100005];
const int INF = 1e9;
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
v[n + 1] = INF; // dp[0][n] -> n, n+1
for (int i = 1; i <= n; ++i) {
dp[0][i] = min(make_pair(v[i], i), make_pair(v[i + 1], i + 1));
}
for (int i = 1; i < 20; ++i) {
for (int j = 1; j <= n; ++j) {
if (j + (1 << i) > n) continue;
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
}
}
lg[1] = 0;
for (int i = 2; i <= n; ++i) {
lg[i] = lg[i / 2] + 1;
}
for (int i = 1; i <= m; ++i) {
int left, right;
cin >> left >> right;
if (left == right) {
cout << v[left] << '\n';
continue;
}
int p = lg[right - left];
// left + 2 ^ p <= right
// 2 ^ p <= right - left
pair <int, int> ans = min(dp[p][left], dp[p][right - (1 << p)]);
cout << ans.first << '\n';
}
return 0;
}