#include <bits/stdc++.h>
using namespace std;
// Idea from sparse tree https://www.topcoder.com/thrive/articles/Range%20Minimum%20Query%20and%20Lowest%20Common%20Ancestor
ifstream f("rmq.in");
ofstream g("rmq.out");
int N, M, ST[100000][18], A[100000];
int main() {
std::ios::sync_with_stdio(false);
f >> N >> M;
for (int i = 0; i < N; i++) {
ST[i][0] = i;
f >> A[i];
}
for (int j = 1; (1 << j) <= N; j++) {
for (int i = 0; i + (1 << j) - 1 < N; i++)
ST[i][j] = (A[ST[i][j - 1]] < A[ST[i + (1 << (j - 1))][j - 1]]) ?
ST[i][j - 1] : ST[i + (1 << (j - 1))][j - 1];
}
/** for (int j = 0; (1 << j) <= N; j++) {
for (int i = 0; i + (1 << j) - 1 < N; i++)
cout << ST[i][j] << ' ';
cout << '\n';
} */
for (int i, j; f >> i >> j;) {
i--, j--;
int k = log2(j - i + 1);
g << min(A[ST[i][k]], A[ST[j - (1 << k) + 1][k]]) << '\n';
}
return 0;
}