Pagini recente » Cod sursa (job #1941620) | Cod sursa (job #1667390) | Cod sursa (job #64053) | Cod sursa (job #2551433) | Cod sursa (job #1909551)
#include <bits/stdc++.h>
using namespace std;
const int nMax = 100009;
const int logNmax = log2(nMax + 1);
int n, m, a[nMax];
int rmq[logNmax][nMax];
int preLog[nMax];
void calcprelog() {
for (int i = 2; i <= n; ++i)
preLog[i] = preLog[i >> 1] + 1;
}
void buildrmq() {
for (int i = 1; i <= n; ++i)
rmq[0][i] = a[i];
for (int i = 1; (1 << i) <= n; ++i) {
int len = (1 << i);
for (int j = 1; j + len - 1 <= n; ++j) {
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + len / 2]);
}
}
}
int Query(int i, int j) {
int dif = j - i + 1;
int logDif = preLog[dif];
return min(rmq[logDif][i], rmq[logDif][j - (1 << logDif) + 1]);
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
calcprelog();
buildrmq();
for (int i = 1; i <= m; ++i) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", Query(x, y));
}
return 0;
}