Cod sursa(job #1403247)

Utilizator BLz0rDospra Cristian BLz0r Data 27 martie 2015 09:59:58
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 100002
#define Lmax 18

FILE *f = fopen ( "rmq.in", "r" );
FILE *g = fopen ( "rmq.out", "w" );

int RMQ[Lmax][Nmax], v[Nmax], lg[Nmax];

int main(){
    int N, M, x, y;

    fscanf ( f, "%d%d", &N, &M );

    for ( int i = 1; i <= N; ++i ){
        fscanf ( f, "%d", &v[i] );
        RMQ[0][i] = v[i];
    }
    for ( int i = 2; i <= N; ++i )
        lg[i] = lg[i>>1] + 1;

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

    for ( int i = 1; i <= M ; ++i ){
        fscanf ( f, "%d%d", &x ,&y );
        int dif = y - x + 1;
        int k = lg[dif];
        int t = dif - ( 1 << k ) ;
        fprintf ( g, "%d\n", min ( RMQ[k][x], RMQ[k][x+t] ) );
    }

    return 0;
}