#include <bits/stdc++.h>
#define minn(a,b) a < b ? a : b
#define NMAX 100001
#define INF 1 << 30
using namespace std;
int N, M, x, y, range[4 * NMAX];
void update(int node, int left, int right, int a, int b, int value) {
if (left == right) {
range[node] = value;
return;
} else {
int middle = left + (right - left) / 2;
if (a <= middle) {
update (2 * node + 1, left, middle, a, b, value);
}
if (middle < b) {
update(2 * node + 2, middle + 1, right, a, b, value);
}
range[node] = minn(range[2 * node + 1], range[2 * node + 2]);
}
}
int read(int node, int left, int right, int a, int b) {
int first = INF, second = INF;
if (a <= left && right <= b) {
return range[node];
} else {
int middle = left + (right - left) / 2;
if (a <= middle) {
first = read(2 * node + 1, left, middle, a, b);
}
if (middle < b) {
second = read(2 * node + 2, middle + 1, right, a, b);
}
return minn(first, second);
}
}
int main() {
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int it = 0; it < N; ++it) {
scanf("%d", &x);
update(0, 0, N - 1, it, it, x);
}
for (int it = 0; it < M; ++it) {
scanf("%d%d", &x, &y);
printf("%d\n", read(0, 0, N - 1, x - 1, y - 1));
}
fclose(stdin);
fclose(stdout);
return 0;
}