Pagini recente » Cod sursa (job #2777146) | Cod sursa (job #541248) | Cod sursa (job #1294280) | Cod sursa (job #1168014) | Cod sursa (job #2078518)
#include <cstdio>
#include <vector>
#include <cstring>
#include <math.h>
#include <iostream>
using namespace std;
#define NMAX 100001
#define LMAX 18
int n, m;
int A[NMAX];
int M[NMAX][LMAX];
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]);
}
for (int i = 1; i <= n; i++) {
M[i][0] = i;
}
for (int j = 1; 1 << j <= n; j++) {
for (int i = 1; i + (1 << (j - 1)) <= n; i++) {
if (A[M[i][j - 1]] <= A[M[i + (1 << (j - 1))][j - 1]]) {
M[i][j] = M[i][j - 1];
} else {
M[i][j] = M[i + (1 << (j - 1))][j - 1];
}
}
}
// for (int i = 1; i <= n; i++) {
// for (int j = 0; 1 << j <= n; j++) {
// cout << M[i][j] << " ";
// }
// cout << "\n";
// }
int x, y;
for (int t = 1; t <= m; t++) {
scanf("%d %d\n", &x, &y);
int k = log2(y - x + 1);
// cout << "k " << k << "\n";
// cout << A[M[x][k]] << " " << A[M[y - (1 << k) + 1][k]] << "\n";
int rmq = min(A[M[x][k]], A[M[y - (1 << k) + 1][k]]);
printf("%d\n", rmq);
}
return 0;
}