#include <fstream>
#include <iostream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, m, x, opt, pos, p, u, mini;
int* arb;
//acelasi program ca la arbint doar ca nu exista operatii de update iar arborele de intervale retine minime, nu maxime
void update(int nod, int p, int u, int pos, int val) {
int mij;
if (p == u) {
arb[nod] = val;
return;
}
mij = (p + u) / 2;
if (pos <= mij)
update(2 * nod, p, mij, pos, val);
else update(2 * nod + 1, mij + 1, u, pos, val);
arb[nod] = min(arb[2 * nod], arb[2 * nod + 1]);
}
void query(int nod, int p, int u, int ip, int iu) {
int mij;
if (ip <= p && u <= iu) {
if (arb[nod] < mini)
mini = arb[nod];
return;
}
mij = (p + u) / 2;
if (ip <= mij)
query(2 * nod, p, mij, ip, iu);
if (mij < iu)
query(2 * nod + 1, mij + 1, u, ip, iu);
}
int main()
{
f >> n >> m;
arb = new int(2 * n + 10);
for (int i = 1; i <= n; i++) {
f >> x;
update(1, 1, n, i, x);
}
for (int i = 0; i < m; i++) {
f >> p >> u;
mini = 100001;
query(1, 1, n, p, u);
g << mini << "\n";
}
delete arb;
return 0;
}