Cod sursa(job #1216745)

Utilizator xtreme77Patrick Sava xtreme77 Data 5 august 2014 17:16:38
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

#define rint register int

const char IN [ ] = "rmq.in" ;
const char OUT [ ] = "rmq.out" ;
const int LOGMAX = 20 ;
const int MAX = 1000014 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

int R [ LOGMAX ] [ MAX ] , log [ MAX ] ;

int main( )
{
    int n , m ;
    fin >> n >> m ;
    for ( rint i = 1 ; i <= n ; ++ i ){
        int x ;
        fin >> x ;
        R [ 0 ] [ i ] = x ;
    }
    log [ 1 ] = 0 ;
    for ( rint i = 2 ; i <= n ; ++ i )
        log [ i ] = log [ i >> 1 ] + 1 ;
    for ( rint i = 1 ; ( 1 << i ) <= n ; ++ i ) {
        int lim = n - ( 1 << i ) + 1 ;
        for ( rint j = 1 ; j <= lim ; ++ j )
        {
            int l = 1 << ( i - 1 );
            R [ i ] [ j ] = min ( R [ i - 1 ] [ j ] , R [ i - 1 ] [ j + l ] ) ;
        }
    }
    while ( m -- )
    {
        int x , y ;
        fin >> x >> y ;
        int diff = y - x + 1 ;
        int lg = log [ diff ] ;
        int l = diff - (1 << lg) ;
        fout << min ( R [ lg ] [ x ] , R [ lg ] [ x + l ] ) << '\n' ;
    }
    return 0;
}