#include <bits/stdc++.h>
#define pb push_back
#define sz size()
using namespace std ;
const int NR = 100001 ;
ifstream f ("darb.in") ;
ofstream g ("darb.out") ;
vector < int > v [ NR ] ;
int level [ NR ] , last ;
const int NMAX = 100 ;
const int LOGNMAX = 11;
void rmq_sol1 ( int rmq [ NMAX ][ NMAX ] , int v [ NMAX ] , int n )
{
int i , j ;
for ( i = 1 ; i <= n ; ++ i )
rmq [ i ][ i ] = v [ i ] ;
for ( i = 1 ; i < n ; ++ i )
for ( j = i + 1; j <= n ; ++ j )
rmq [ i ][ j ] = min ( rmq [ i ][ j - 1 ] , v [ j ] ) ;
}
int query_sol1 ( int rmq [ NMAX ][ NMAX ] , int v [ NMAX ] , int n , int a , int b )
{
if ( a > b ) swap ( a , b ) ;
return rmq [ a ][ b ] ;
}
void rmq_sol2 ( int rmq2 [ NMAX ] , int v [ NMAX ] , int n , int k )
{
int i , cnt = 0 ;
for( i = 0 ; i < n ; ++ i )
{
if ( !( i % k ) )
rmq2 [ ++ cnt ] = v [ i ] ;
else
rmq2 [ cnt ] = min ( rmq2 [ cnt ] , v[ i ] ) ;
}
}
int query_sol2 ( int rmq2 [ NMAX ] , int v [ NMAX ] , int n , int k , int st , int dr )
{
int i , minim = ( 1 << 30 ) , t ;
for ( i = st ; i % k && i <= dr ; ++ i ) minim = min ( minim , v [ i ] ) ;
t = i / k ;
for ( ; i + k - 1 <= dr ; ++ i ) minim = min ( minim , rmq2 [ t ++ ] ) ;
for ( ; i <= dr ; ++ i ) minim = min ( minim , v[ i ] ) ;
return minim ;
}
void rmq_sol3 ( int rmq3 [ LOGNMAX ][ NMAX ] , int lg [ NMAX ] , int v [ NMAX ] , int n )
{
int i ,j ;
for ( i = 0 ; i < n ; ++ i ) rmq3 [ 0 ][ i ] = v [ i ] ;
for ( i = 0 ; ( 1 << i ) < n ; ++ i )
for ( j = 0 ; j + ( 1 << i ) <= n ; ++ j )
rmq3 [ i ][ j ] = min ( rmq3 [ i - 1 ][ j ] , rmq3 [ i - 1 ][ j + ( 1 << i ) ] ) ;
for ( i = 2 ; i <= n ; ++ i ) lg [ i ] = lg [ i >> 1 ] + 1 ;
}
int query_sol3 ( int rmq3 [ LOGNMAX ][ NMAX ] , int lg [ NMAX ] , int a , int b )
{
if ( a > b ) swap ( a , b ) ;
int log = lg [ b - a + 1 ] ;
return min ( rmq3 [ log ][ a ] , rmq3 [ log ][ b - ( 1 << log ) + 1 ] ) ;
}
/*
void rmq__father ( int rmq_father )
{
int i , j ;
for ( i = 1 ; i <= n ; ++ i ) rmq_father [ 0 ][ i ] = Father [ i ] ;
for ( i = 1 ; ( 1 << i ) <= n ; ++ i )
for ( j = 1 ; j <= n ; ++ j ) rmq_father [ i ][ j ] = rmq_father [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ;
}
int query_father( int nod , int nr )
{
log = lg [ n ] ;
while ( log -- ) if ( ( 1 << log ) & nr ) nod = rmq [ log ][ nod ] ;
g << nod << "\n" ;
}
void rmq_father__rmq_edge_fun ( )
{
for ( int i = 1 ; i <= n ; ++ i )
{
rmq_father [ 0 ][ i ] = Father [ i ] ;
rmq_edge [ 0 ][ i ] = Father_edge [ i ] ;
}
for ( int i = 1 ; ( 1 << i ) <= n ; ++ i )
for ( int j = 1 ; j <= n ; ++ j )
{
rmq_father [ i ][ j ] = rmq_father [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ;
rmq_edge [ i ][ j ] = min ( rmq_edge [ i - 1 ][ j ] , rmq_edge [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ) ;
}
}
*/
int main ()
{
int n , q ; f >> n >> q ;
int v[ NMAX ] = { 0} ;
int rmq1 [ NMAX ][ NMAX ] = {0} ;
for ( int i = 1 ; i <= n ; ++ i ) f >> v[ i ];
rmq_sol1 ( rmq1 , v , n ) ;
while ( q -- )
{
int a , b ; f >> a >> b ;
for ( int i = min ( a , b ) ; i <= max ( a ,b ) ; ++ i ) cout << v [ i ] << " " ;
cout << query_sol1 ( rmq1 , v , n , a , b ) << "\n" ;
}
}