#include <fstream>
#include <cmath>
#define MaxN 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M, aib[2 * MaxN + 100], minn, x, l ,r;
int min(int a, int b) {
return a < b ? a : b;
}
void update(int node, int left, int right, int pos, int value) {
if (left == right) {
aib[node] = value;
return;
}
int middle = left + (right - left) / 2;
if (pos <= middle)
update(2 * node, left, middle, pos, value);
else
update(2 * node + 1, middle + 1, right, pos, value);
aib[node] = min(aib[2 * node], aib[2 * node + 1]);
}
void query(int node, int start, int end, int left, int right) {
if (left <= start && end <= right) {
minn = min(minn, aib[node]);
return;
}
int middle = start + (end - start) / 2;
if (left <= middle)
query(2 * node, start, middle, left, right);
if (middle < right)
query(2 * node + 1, middle + 1, end, left, right);
}
int main() {
fin >> N >> M;
for (int i = 1; i <= N; ++i) {
fin >> x;
update(1, 1, N, i, x);
}
for (int j = 0; j < M; ++j) {
fin >> l >> r;
minn = ~(1 << 31);
query(1, 1, N, l, r);
fout << minn << '\n';
}
return 0;
}