#include <stdio.h>
#define maxn 100010
int min(int a,int b) { if(a<b) return a; return b; }
int max(int a,int b) { if(a>b) return a; return b; }
int arb[4*maxn],n,m,i,val,pos,start,finish,p;
void update(int nod,int st,int dr)
{
if(st==dr) { arb[nod]=val; return; }
int mid=(st+dr)>>1;
if(i<=mid) update(nod<<1,st,mid);
if(i>mid) update((nod<<1)|1,mid+1,dr);
arb[nod]=min(arb[nod<<1],arb[(nod<<1)|1]);
}
void query(int nod,int st,int dr)
{
if(start<=st && dr<=finish)
{
if(p>arb[nod]) p=arb[nod];
return;
}
int mid=(st+dr)>>1;
if(start<=mid) query(nod<<1,st,mid);
if(finish>mid) query((nod<<1)|1,mid+1,dr);
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++) { scanf("%d",&val); update(1,1,n); }
for(; m>0; m--)
{
scanf("%d%d",&start,&finish);
p=maxn; query(1,1,n);
printf("%d\n",p);
}
return 0;
}