Cod sursa(job #1889261)

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

#define NMAX 100005
#define lgNMAX 18

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

int main () {

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

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

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

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

    for ( i = 1; i <= Log[ 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 ] );
        }
    }

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



    return 0;

}