#include <stdio.h>
#include <stdlib.h>
#define N 1<<18
#define M 1<<20
int v[N],minim,inc,sf,poz,n,m,x,ordine[M],rasp[M];
struct intrebare
{
int a,b;
};
intrebare t[M];
inline int min(int a,int b)
{
if (a<b)
return a;
return b;
}
void update(int nod,int st,int dr)
{
if (st==dr)
{
v[nod]=x;
return;
}
int t=(st+dr)/2;
if (poz<=t)
update(nod*2,st,t);
else
update(nod*2+1,t+1,dr);
v[nod]=min(v[nod*2],v[nod*2+1]);
}
void query(int nod,int st,int dr)
{
if (inc<=st && dr<=sf)
{
if (minim>v[nod])
minim=v[nod];
return;
}
int t=(st+dr)/2;
if (inc<=t)
query(nod*2,st,t);
if (t<sf)
query(nod*2+1,t+1,dr);
}
int compar(const void *p,const void *q)
{
int x=*(int*)p;
int y=*(int*)q;
if (t[x].a<t[y].a)
return -1;
if (t[x].a>t[y].a)
return 1;
if (t[x].b<t[y].b)
return -1;
if (t[x].b>t[y].b)
return 1;
return 0;
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
int i;
for (i=1; i<=n; i++)
{
scanf("%d",&x);
poz=i;
update(1,1,n);
}
for (i=1; i<=m; i++)
{
scanf("%d%d",&t[i].a,&t[i].b);
ordine[i]=i;
}
qsort(ordine+1,m,sizeof(ordine[0]),compar);
for (i=1; i<=m; i++)
{
if (t[ordine[i]].a==t[ordine[i-1]].a &&
t[ordine[i]].b==t[ordine[i-1]].b)
rasp[ordine[i]]=minim;
else
{
inc=t[ordine[i]].a;
sf=t[ordine[i]].b;
minim=100001;
query(1,1,n);
rasp[ordine[i]]=minim;
}
}
for (i=1; i<=m; i++)
printf("%d\n",rasp[i]);
return 0;
}