Cod sursa(job #379864)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 4 ianuarie 2010 11:55:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <algorithm>
using namespace std;

#define DIM 100001
#define LOG 20

int n, m, a[ DIM ], l[ DIM ], r[ LOG ][ DIM ];

void rmq() {

    int i, j;

    for( i = 2; i <= n; ++i )
        l[ i ] = l[ i>>1 ] + 1;
    for( i = 1; i <= n; ++i )
        r[ 0 ][ i ] = i;

    for( i = 1; ( 1<<i ) <= n; ++i )
        for( j = 1; j <= n-( 1<<i )+1; ++j ) {

            r[ i ][ j ] = r[ i-1 ][ j ];
            if( a[ r[ i-1 ][ j+( 1<<( i-1 ) ) ] ] < a[ r[ i ][ j ] ] )
                r[ i ][ j ] = r[ i-1 ][ j+( 1<<( i-1 ) ) ];
        }
}

int calc( int x, int y ) {

    int dif, log, rez;

    dif = y-x+1;
    log = l[ dif ];
    rez = r[ log ][ x ];
    if( a[ r[ log ][ y-( 1<<log )+1 ] ] < a[ rez ] )
        rez = r[ log ][ y-( 1<<log )+1 ];

    return a[ rez ];
}

int main() {

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

    int i, x, y;

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

    rmq();

    for( i = 1; i <= m; ++i ) {

        scanf( "%d %d", &x, &y );
        printf( "%d\n", calc( x, y ) );
    }

    return 0;
}