Cod sursa(job #1889279)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 22 februarie 2017 17:40:13
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define NMAX 100005
#define lgNMAX 18

int v[ lgNMAX ][ NMAX ];
int Log[ NMAX ];

void cumputeRMQ ( int n ) {

    int i, j, interval;

    for ( i = 2; i <= NMAX; ++i ) Log[ i ] = Log[ i / 2 ] + 1;

    for ( i = 1; ( 1 << i) <= n; ++i ) {
        for ( j = 1; j <= n - ( 1 << i ) + 1; ++j ) {
            interval = ( 1 << ( i - 1 ) );
            v[ i ][ j ] = min( v[ i - 1 ][ j ], v[ i - 1 ][ j + interval ] );
        }
    }

}

int main () {

    freopen( "rmq.in", "r", stdin );
    freopen( "rmq.out", "w", stdout );

    int n, m, i, j, x, y, r, t, st, dr;

    scanf( "%d%d",&n,&m );
    for ( i = 1; i <= n; ++i ) scanf( "%d",&v[ 0 ][ i ] );

    cumputeRMQ( n );

    while ( m-- ) {
        scanf( "%d%d",&st,&dr );
        if ( st > dr ) swap( st, dr );
        t = Log[ dr - st + 1 ];
        printf( "%d\n", min( v[ t ][ st ], v[ t ][ dr - ( 1 << t ) + 1 ] ) );
    }



    return 0;

}