#include <bits/stdc++.h>
#define pb push_back
#define sz size()
using namespace std ;
const int NR = 100001 ;
ifstream f ("rmq.in") ;
ofstream g ("rmq.out") ;
vector < int > v [ NR ] ;
int level [ NR ] , last ;
const int NMAX = 100001 ;
const int LOGNMAX = 11;
const int SQRTNMAX = 1000 ;
int cnt ;
void rmq_sol2 ( int rmq [ SQRTNMAX ] , int v [ NMAX ] , int n , int k )
{
int i ;
for( i = 1 ; i <= n ; ++ i )
{
if ( !( ( i - 1 ) % k ) )
rmq [ ++ cnt ] = v [ i ] ;
else
rmq [ cnt ] = min ( rmq [ cnt ] , v[ i ] ) ;
}
}
int query_sol2 ( int rmq [ SQRTNMAX ] , int v [ NMAX ] , int n , int k , int st , int dr )
{
int i , minim = ( 1 << 30 ) , t ;
for ( i = st ; ( i - 1 ) % k && i <= dr ; ++ i ) minim = min ( minim , v [ i ] ) ;
// elementele dinaintea primei secvente complete
t = i / k + 1 ; // indexul secventei actuale
for ( ; i + k - 1 <= dr ; i += k ) minim = min ( minim , rmq [ t ++ ] ) ;
// fiecare secventa din interval
for ( ; i <= dr ; ++ i ) minim = min ( minim , v[ i ] ) ;
// elementele de dupa ultima secventa completa
return minim ;
}
int main ()
{
int n , q ; f >> n >> q ;
int v[ NMAX ] = { 0} ;
int rmq2 [ SQRTNMAX ] = {0} ;
for ( int i = 1 ; i <= n ; ++ i ) f >> v[ i ];
int k = sqrt( n ) ; //cout << k;
rmq_sol2 ( rmq2 , v , n , k ) ;
while ( q -- )
{
int a , b ; f >> a >> b ;
g << query_sol2 ( rmq2 , v , n , k , a , b ) << "\n" ;
}
}