Cod sursa(job #696874)
#include<cstdio>
#include<vector>
#define INfile "rmq.in"
#define OUTfile "rmq.out"
#define NMAX 100002
using namespace std ;
int N , M ;
int V[NMAX][18] ;
vector < int > A ( NMAX ) ;
void read () ;
void make_table () ;
void solve () ;
int main ()
{
freopen ( INfile , "r" , stdin ) ;
freopen ( OUTfile , "w" , stdout ) ;
read () ;
make_table () ;
solve () ;
return 0 ;
}
void read ()
{
int i , x ;
scanf ( "%d%d" , & N , & M ) ;
for ( i = 1 ; i <= N ; ++ i )
{
scanf ( "%d" , & x ) ;
V [ i ][ 0 ]= x ;
}
}
void make_table ()
{
int i , j , t ;
t = 2 ;
A [ 1 ] = 0 ;
for ( i = 2 ; i <= N ; ++ i )
A [ i ] = A [ i / 2 ] + 1 ;
/*
if ( i == t )
{
A [ i ] = t ;
t <<= 1 ;
}
else
A [ i ] = A [ i - 1 ] ;
*/
for ( j = 1 ; ( 1 << j ) <= N ; ++ j )
for ( i = 1 ; i + ( 1 << j ) - 1 <= N ; ++ i )
{
t = 1 << ( j - 1 ) ;
V [ i ][ j ]= ( V [ i ][ j - 1 ] > V [ i + t ][ j - 1 ] ? V [ i + t ][ j -1 ] : V [ i ][ j - 1 ] ) ;
}
/*
for ( i = 1 ; i <= N ; printf( "\n" ) , ++ i )
for ( j = 0 ; j < (int) V [ i ].
() ; ++ j )
printf ( "%d " , V [ i ][ j ] ) ;
*/
}
void solve ()
{
int i , x , y , diff ;
for ( i = 1 ; i <= M ; ++ i )
{
scanf ( "%d%d" , & x , & y ) ;
diff = y - x + 1 ;
y = V [ y - ( 1 << A [ diff ] ) + 1 ][ A [ diff ] ] ;
x = V [ x ][ A [ diff] ] ;
printf ( "%d\n" , ( x > y ? y : x ) ) ;
}
}