Cod sursa(job #539237)

Utilizator SpiderManSimoiu Robert SpiderMan Data 22 februarie 2011 18:27:09
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
# include <cstdio>

# define min(a, b) ( a < b ? a : b )

const char *FIN = "rmq.in", *FOU = "rmq.out" ;
const int MAX = 100005 ;

int dp[MAX / 5000][MAX] ;
int pt[MAX] ;
int N, M, i, j ;

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    scanf ( "%d %d", &N, &M ) ;
    for ( i = 1; i <= N; ++i ) {
        scanf ( "%d", dp[0] + i ) ;
    }

    for ( i = 2; i <= N; ++i ) {
        pt[i] = pt[i >> 1] + 1 ;
    }

    for ( i = 1; 1 << i <= N; ++i ) {
        for ( j = 1; j <= N - ( 1 << i ) + 1; ++j ) {
            dp[i][j] = min ( dp[i - 1][j], dp[i - 1][j + ( 1 << i - 1 )] ) ;
        }
    }

    for ( ; M ; --M ) {
        scanf ( "%d %d", &i, &j ) ;
        printf ( "%d\n", min ( dp[pt[j - i + 1]][i], dp[pt[j - i + 1]][i + ( j - i + 1 - ( 1 << pt[j - i + 1] ) )] ) ) ;
    }
}