Pagini recente » Cod sursa (job #101496) | Cod sursa (job #538109) | Cod sursa (job #2689051) | Cod sursa (job #3217391) | Cod sursa (job #2217082)
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int MAXN = 1e6;
const int MAXM = 1e6;
const int MAX2 = 20;
int n, m;
int v[MAXN + 2];
int dp[MAXN + 2][MAX2 + 1];
int p[21];
void precalc() {
p[0] = 1;
for (int i = 1; i < MAX2; ++ i) {
p[i] = p[i - 1] * 2;
}
}
int main() {
in >> n >> m;
int put = 1;
while (put <= n)
put <<= 1;
put >>= 1;
precalc();
for (int i = 1; i <= n; ++ i) {
in >> v[i];
dp[i][0] = v[i];
}
for (int j = 1; j <= put; ++ j) {
for (int i = 1; i + p[j] - 1 <= n; ++ i) {
dp[i][j] = min(dp[i][j - 1], dp[i + p[j - 1]][j - 1]);
}
}
int x, y, l;
for (int i = 1; i <= m; ++ i) {
in >> x >> y;
l = y - x + 1;
put = 31 - __builtin_clz(l);
out << min(dp[x][put], dp[y - p[put] + 1][put]) << '\n';
}
return 0;
}