Cod sursa(job #2247450)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 28 septembrie 2018 17:27:54
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <cstdio>
using namespace std;

#define NMAX 100005
#define INFI 0x3f3f3f3f
#define LGMAX 20

int D[ LGMAX ][ NMAX ];

int logaritm ( int k ) {

    int i = 1, s = 0;

    while ( i < k ) {
        s++;
        i *= 2;
    }

    return s;

}

int main () {

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

    int n, m, i, j, k, ln, lg, ma, st, dr;

    scanf( "%d%d", &n, &m );
    for ( i = 0; i <= LGMAX; ++i ) {
        for ( j = 0; j <= n; ++j ) D[ i ][ j ] = INFI;
    }
    for ( i = 1; i <= n; ++i ) scanf( "%d", &D[ 0 ][ i ] );

    for ( i = 1; i <= LGMAX; ++i ) {
        k = 1 << i;
        for ( j = 1; j + k  - 1 <= n; ++j ) {
            D[ i ][ j ] = min( D[ i - 1 ][ j ], D[ i - 1 ][ j + k / 2  ] );
        }
    }

    while ( m-- ) {
        scanf( "%d%d", &st, &dr );
        ln = dr - st;
        lg = logaritm ( ln );
        printf( "%d\n", min( D[ lg ][ st ], D[ lg ][ dr - ( 1 << lg ) + 1 ] ) );
    }

    return 0;
}