Cod sursa(job #1244585)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 17 octombrie 2014 20:27:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>

using namespace std;

ifstream fin( "rmq.in" );
ofstream fout( "rmq.out" );

const int nmax = 100000;
const int logmax = 16;
int n, m, d[ nmax + 1 ][ logmax + 1 ];
int pr[ nmax ];

inline int min2( int x, int y ) {
    if ( x < y ) {
        return x;
    } else {
        return y;
    }
}
int memo( int k ) {
    if ( pr[ k ] > 0 ) {
        return pr[ k ];
    }
    if ( k == 1 ) {
        return 0;
    } else {
        return ( pr[ k ] = memo( k / 2 ) + 1 );
    }
}
void read() {
    fin >> n >> m;
    for( int i = 1; i <= n; ++ i ) {
        fin >> d[ i ][ 0 ];
    }
}
void solve() {
    for( int j = 1, p = 1; p <= n; ++ j, p <<= 1 ) {
        for( int i = 1; i + p + p - 1 <= n; ++ i ) {
            d[ i ][ j ] = min2( d[ i ][ j - 1 ], d[ i + p ][ j - 1 ] );
        }
    }
    pr[ 1 ] = 0;
}
int main() {
    int x, y, t;

    read();

    solve();

    for( ; m > 0; -- m ) {
        fin >> x >> y;
        t = memo( y - x + 1 );
        fout << min2( d[ x ][ t ], d[ y - (1 << t) + 1 ][ t ] ) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}