#include <iostream>
#include <fstream>
using namespace std;
int tree[4* 100000];
int v[100000];
void build(int index, int st, int dr) {
if (st == dr) {
tree[index] = v[dr];
return;
}
int m = (st + dr) / 2;
build(2 * index + 1, st, m);
build(2 * index + 2, m + 1, dr);
tree[index] = min(tree[2 * index + 1], tree[2 * index + 2]);
}
int afisare(int index, int st, int dr, int a, int b)
{
if (a <= st && dr <= b)
return tree[index];
int m = st + (dr - st) / 2;
if (a > m)
return afisare(2 * index + 2, m + 1, dr, a, b);
else if (b <= m)
return afisare(2 * index + 1, st, m, a, b);
int arbStg = afisare(2 * index + 1, st, m, a, m);
int arbDr = afisare(2 * index + 2, m + 1, dr, m + 1, b);
return min(arbStg, arbDr);
}
int main()
{
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, m, a, b, x;
in >> n >> m;
for (int i = 1; i <= n; i++)
in >> v[i];
build(1, 1, n);
for (int i = 0; i < m; i++) {
in >> a >> b;
out << afisare(1, 1, n, a, b) << "\n";
}
}