Pagini recente » Cod sursa (job #204019) | Cod sursa (job #83659) | Cod sursa (job #2489037) | Cod sursa (job #2432149) | Cod sursa (job #1413991)
#include <iostream>
#include <cstdio>
using namespace std;
const int lmax = 18 ;
const int nmax = 100005 ;
int n,m;
int v[nmax] ;
int dp[lmax][nmax] ;
int bun( int a , int b )
{
if ( b <= n )
return dp[a][b] ;
return dp[a][n] ;
}
void rezolvare()
{
for ( int i = 1 ; i <= n ; i ++ )
dp[0][i] = v[i] ;
for ( int i = 1 ; 2*(n-1) >> i ; i ++ )
for ( int j = 1 ; j <= n ; j ++ )
dp[i][j] = min( bun( i - 1 , j ) , bun( i - 1 , j + ( 1 << ( i - 1 ) ) ) ) ;
}
int lg( int nr )
{
int i;
for (i = 0; nr>>i; i++);
return i-1;
}
int main()
{
freopen( "rmq.in" , "r" , stdin ) ;
freopen( "rmq.out" , "w" , stdout ) ;
scanf( "%d %d" , &n , &m ) ;
for ( int i = 1 ; i <= n ; i ++ )
scanf( "%d" , &v[i] ) ;
rezolvare() ;
int a , b ;
for ( ; m ; m -- )
{
scanf( "%d %d" , &a , &b ) ;
int nr ;
nr = lg(b-a+1) ;
printf( "%d\n" , min( bun(nr,a) , bun( nr , b + 1 - ( 1 << nr ) ) ) ) ;
}
return 0;
}