#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
#define NMAX 100001
int n, a[NMAX], m, arb[4*NMAX];
void update(int st, int dr, int poz, int nod)
{
if(st == dr)
{
arb[nod] = a[poz];
return;
}
int mid = ((st+dr)>>1);
if(mid >= poz)
update(st, mid, poz, (nod<<1));
if(mid < poz)
update(mid+1, dr, poz, (nod<<1)+1);
arb[nod] = min(arb[nod<<1], arb[(nod<<1)+1]);
}
int query(int st, int dr, int st1, int dr1, int nod)
{
if(st == st1 && dr == dr1)
return arb[nod];
int mid = (st+dr)/2;
if(mid >= dr1)
return query(st, mid, st1, dr1, (nod<<1));
if(mid < st1)
return query(mid+1, dr, st1, dr1, (nod<<1)+1);
return min(query(st, mid, st1, mid, (nod<<1)), query(mid+1, dr, mid+1, dr1, (nod<<1)+1));
}
int main()
{
memset(arb, 10000000, NMAX * 4);
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
fin >> a[i];
update(1,n,i,1);
}
int x, y;
for (int i = 1; i <= m; i++)
{
fin >> x >> y;
fout << query(1, n, x, y, 1) << "\n";
}
return 0;
}