Pagini recente » Cod sursa (job #2556234) | Cod sursa (job #2673342) | Cod sursa (job #2219003) | Cod sursa (job #2067737) | Cod sursa (job #2170542)
#include <bits/stdc++.h>
using namespace std;
const int nmax = static_cast<int> (1e5+1);
const int lgnmax = 18;
int n, m;
int dp[lgnmax][nmax];
inline int pow2(int x) {
return (1 << x);
}
int lg2[nmax];
void precalc_lg2() {
lg2[0] = 1;
for (int i = 2; i <= n; i++) {
lg2[i] = lg2[i / 2] + 1;
}
}
void build_rmq() {
precalc_lg2();
for (int i = 1; i <= lg2[n]; i++) {
for (int j = 1; j <= n - pow2(i) + 1; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + pow2(i - 1)]);
}
}
}
int query(int x, int y) {
if (x > y) swap(x, y);
int k = lg2[y - x + 1];
return min(dp[k][x], dp[k][y - pow2(k) + 1]);
}
int main() {
freopen("carici.in", "r", stdin);
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &dp[0][i]);
}
build_rmq();
for (int i = 1, x, y; i <= m; i++) {
scanf("%d%d", &x, &y);
cout << query(x, y) << "\n";
}
return 0;
}