Cod sursa(job #582234)

Utilizator BitOneSAlexandru BitOne Data 15 aprilie 2011 08:57:15
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
#define l2N 18

using namespace std;
int RMQ[l2N][N_MAX];
inline int _max( int x, int y ) { return ( x >= y ? x : y); }
inline int _min( int x, int y ) { return ( x <= y ? x : y); }
inline int log2N( int N ) { return 31-__builtin_clz(N); }
int main( void )
{
    int N, M, logN, till, i, i2, j, k;
    ifstream in( "rmq.in" );
    in>>N>>M;
    logN=log2N(N);
    for( i=1; i <= N; ++i )
        in>>RMQ[0][i];
    for( i=1, i2=1; i <= N; ++i, i2<<=1 )
    {
        till=N-(i2<<1)+1;
        for( j=1; j <= till; ++j )
            RMQ[i][j]=_min( RMQ[i-1][j], RMQ[i-1][j+i2] );
    }
    ofstream out( "rmq.out" );
    for( ; M; --M )
    {
        in>>i>>j;
        k=log2N( j-i+1 );
        out<<_min( RMQ[k][i], RMQ[k][j-(1<<k)+1]  )<<'\n';
    }
    return EXIT_SUCCESS;
}