Cod sursa(job #1641185)

Utilizator xtreme77Patrick Sava xtreme77 Data 8 martie 2016 21:30:09
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
/**
 * Code by Patrick Sava
 * "Spiru Haret" National College of Bucharest
 **/

# include "fstream"
# include "cstring"
# include "vector"
# include "queue"
# include "bitset"
# include "algorithm"
# include "map"
# include "set"
# include "unordered_map"
# include "deque"
# include "string"
# include "iomanip"
# include "cmath"
# include "stack"
# include "cassert"

const char IN [ ] =  "rmq.in" ;
const char OUT [ ] = "rmq.out" ;

using namespace std ;

# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( register int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( register int a = b ; a >= c ; -- a )

ifstream cin ( IN ) ;
ofstream cout ( OUT ) ;

const int MAX = 1e5 + 14 ;
const int LOG = 20 ;

int RMQ [ LOG ] [ MAX ] ;
int logg [ MAX ] ;

int main ( void )
{
    int n , m ;
    cin >> n >> m ;
    FORN ( i , 1 , n ) {
        cin >> RMQ [ 0 ] [ i ] ;
    }
    FORN ( i , 1 , n ){
        logg [ i ] = logg [ i >> 1 ] + 1 ;
    }
    FORN ( j , 1 , logg [ n ] ) {
        FORN ( i , 1 , n ) {
            RMQ [ j ] [ i ] = min ( RMQ [ j - 1 ] [ i ] , RMQ [ j - 1 ] [ ( ( i + ( 1 << ( j - 1 ) ) ) <= n ) ? ( i + ( 1 << ( j - 1 ) ) ) : i ] ) ;
        }
    }
    while ( m -- )
    {
        int a , b ;
        cin >> a >> b ;
        int diff = b - a ;
        int ll = logg [ diff ] - 1 ;
        cout << min ( RMQ [ ll ] [ a ] , RMQ [ ll ] [ b - ( 1 << ll ) + 1 ] ) << '\n' ;
    }
    return 0;
}