#include <stdio.h>
#define M (1<<17)
#define oo 200000
int A[2*M+1], nr[M];
int minim (int x, int y)
{
return x<=y?x:y;
}
void update (int nod, int st, int dr, int a, int b)
{
int mij;
if (a<=st && dr<=b)
A[nod]=nr[a];
else
{
mij=(st+dr)/2;
if (a<=mij) update (2*nod, st, mij, a, b);
if (mij+1<=b) update(2*nod+1, mij+1,dr, a, b);
A[nod]=minim(A[2*nod], A[2*nod+1]);
}
}
int query (int nod, int st, int dr, int a, int b)
{
int mij, m1=oo, m2=oo;
if (a<=st && dr<=b)
return A[nod];
else
{
mij=(st+dr)/2;
if (a<=mij )m1=query(2*nod, st, mij, a, b);
if (mij+1<=b) m2=query (2*nod+1, mij+1, dr, a, b);
return minim (m1, m2);
}
}
int main()
{
int n,m,i,j;
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d %d",&n, &m);
for(i=1;i<=n;i++)
scanf("%d", &nr[i]);
for(i=n+1;i<=16;i++) nr[i]=oo;
for(i=1;i<=n;i++)
update (1,1,n,i,i);
while (m--)
{
scanf("%d %d",&i,&j);
printf("%d\n",query(1,1,n,i,j));
}
return 0;
}