Cod sursa(job #1386819)

Utilizator AndreiBarbutaAndrei Barbuta AndreiBarbuta Data 13 martie 2015 12:23:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <algorithm>

#define IN "rmq.in"
#define OUT "rmq.out"

const int MAXL = 25 ;
const int MAXN = 100014 ;

using namespace std;

long long dp [ MAXL ] [ MAXN ] ;
long long put [ MAXN ] ;
long long v [ MAXN ] ;

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

int main()
{
    int n , m ;
    fin >> n >> m ;
    for ( register int i = 1 ; i <= n ; ++ i )
        fin >> v [ i ] ;
    put [ 1 ] = 0 ;
    for ( register int i = 2 ; i <= n ; ++ i )
        put [ i ] = put [ i / 2 ] + 1 ;
    for ( register int i = 1 ; i <= n ; ++ i )
        dp [ 0 ] [ i ] = v [ i ] ;
    for ( register int i = 1 ; ( 1 << i ) <= n ; ++ i )
        for ( register int j = 1 ; j <= n - ( 1 << i - 1 ) + 1 ; ++ j ){
            long long l = ( 1 << ( i - 1 ) ) ;
            dp [ i ] [ j ] = min ( dp [ i - 1 ] [ j ] , dp [ i - 1 ] [ j + l ] ) ;
        }
    for ( ; m ; -- m ) {
        long long x , y ;
        fin >> x >> y ;
        int p = put [ y - x + 1 ] ;
        int right = ( y - x + 1 ) - ( 1 << p ) ;
        fout << min ( dp [ p ] [ x ] , dp [ p ] [ x + right ] ) << '\n' ;
    }
    return 0;
}