#include<stdio.h>
#define NMAX 100005
inline int minim(int a,int b)
{
if(a<b)
return a;
return b;
}
void Update(int,int,int);
void Check(int,int,int);
FILE *in,*out;
int poz,i,val,minArb[4*NMAX],n,m,start,finish,min;
int main()
{
in=fopen("rmq.in","rt");
out=fopen("rmq.out","wt");
fscanf(in,"%d %d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(in,"%d",&val);
poz=i;
Update(1,1,n);
}
for(i=1;i<=m;i++)
{
min=100001;
fscanf(in,"%d %d",&start,&finish);
Check(1,1,n);
fprintf(out,"%d\n",min);
}
return 0;
}
void Update(int nod,int left,int right)
{
if(left==right)
{
minArb[nod]=val;
return;
}
int div=(left+right)>>1;
if(poz<=div)
Update(nod<<1,left,div);
else
Update((nod<<1)+1,div+1,right);
minArb[nod]=minim(minArb[nod<<1],minArb[(nod<<1)+1]);
}
void Check(int nod,int left,int right)
{
if(start<=left && finish>=right)
{
if(min>minArb[nod])
min=minArb[nod];
return;
}
int div=(left+right)>>1;
if(start<=div)
Check(nod<<1,left,div);
if(finish>div)
Check((nod<<1)+1,div+1,right);
}