#include<stdio.h>
#include<vector>
#include<string.h>
#include<ctype.h>
using namespace std;
#define dim 100100
#define INF 0x3f3f3f
int v[dim*4] ,n,m,x,MAX;
void afis ()
{
for(int i=1 ; i<=4*n ; i++ )
if ( v[i]>32142134)
printf("0 ");
else
printf("%d ",v[i] ) ;
}
int MIN ( int x, int y )
{
if ( y<=x )
return y;
return x;
}
void update ( int nod , int st , int dr , int poz , int x )
{
if ( st == dr )
{
v[ nod ] = x ;
// printf("%d %d\n",nod , x ) ;
//printf("%d ", x);
return ;
}
int mij = (st+dr)>>1 ;
if ( mij >= poz )
update ( nod*2, st , mij , poz ,x) ;
else
update( nod*2+1 ,mij+1 , dr , poz ,x );
v[ nod ] = MIN ( v[ nod * 2 ] , v[ nod*2+1 ] );
}
void query ( int nod , int st , int dr ,int a ,int b )
{
if ( a <= st && b>=dr )
{
// printf(" %d %d %d\n",a,b,v[nod] ) ;
if ( v[nod]<MAX )
MAX = v[nod] ;
return ;
}
int mij = (st + dr) >> 1 ;
if ( mij >= a )
query (nod*2 ,st , mij , a,b );
if ( mij < b )
query ( nod*2+1 , mij+1 , dr , a ,b ) ;
}
void read()
{
scanf("%d %d",&n,&m);
for(int i=1 ; i<=n;i++)
{
scanf("%d",&x);
update( 1 ,1 ,n ,i ,x ) ;
}
// afis(); printf("\n");
int a,b;
for(int i=1 ; i<=m;i++)
{
MAX = INF;
scanf("%d %d",&a,&b);
query ( 1,1,n ,a ,b );
printf("%d\n",MAX ) ;
}
}
int main ()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
memset ( v , INF , sizeof ( v ) ) ;
read();
//solve();
return 0;
}