//arbori de intervale
//log n pe query -> minim pe interval <-
#include<stdio.h>
int a[100000],m[200002],mij,n,i,pozmin,p1,p2,j,mm,fact;
int inita(int nod, int b, int e)
{
if (b==e)
m[nod]=b;
else
{
mij=(b+e)/2;
inita(2*nod,b,mij);
inita(2*nod+1,mij+1,e);
if (a[m[2*nod+1]]>a[m[2*nod]]) m[nod]=m[2*nod];
else m[nod]=m[2*nod+1];
}
return 0;
}
int query(int nod,int b, int e, int s, int d)
{
int vals,vald;
if (e<s||d<b) return -1;
else
if (s<=b&&e<=d) return m[nod];
else
{
mij=(b+e)/2;
vals=query(2*nod,b,mij,s,d);
vald=query(2*nod+1,mij+1,e,s,d);
if (vals==-1) return vald;
if (vald==-1) return vals;
if (a[vals]<a[vald]) return vals;
else return vald;
}
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld %ld",&n,&mm);
for(i=1;i<=n;i++)
{
scanf("%ld",&a[i]);
}
for(i=1;i<=2*n+1;i++)
m[i]=-1;
inita(1,1,n);
for(j=1;j<=mm;j++)
{
scanf("%ld %ld",&p1,&p2);
pozmin=query(1,1,n,p1,p2);
printf("%ld\n",a[pozmin]);
}
return 0;
}