Cod sursa(job #1413991)

Utilizator Burbon13Burbon13 Burbon13 Data 2 aprilie 2015 11:35:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#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;
}