Cod sursa(job #460130)

Utilizator BitOneSAlexandru BitOne Data 1 iunie 2010 12:01:55
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <cstdlib>
#include <fstream>
#define Nmax 100111
#define LogNmax 17

/*
 *
 */
using namespace std;
int RMQ[Nmax][LogNmax];
inline int Log2( int N )
{
    if( N <= 0 )
        return -1;
    int r=0;
    if( N >= 65536 )
        N>>=16, r+=16;
    if( N >= 256 )
        N>>=8, r+=8;
    if( N >= 16 )
        N>>=4, r+=4;
    if( N >= 4 )
        N>>=2, r+=2;
    if( N >= 2 )
        r+=1;
    return r;
}
int main( void )
{
    int N, M, i, j, jdx, Log2N, till;
    ifstream in( "rmq.in" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
        in>>RMQ[i][0];
    Log2N=Log2(N);
    for( j=1; j <= Log2N; ++j )
    {
        jdx=( 1<<(j-1) );
        till=N-jdx*2+1;
        for( i=1; i <= till; ++i )
            RMQ[i][j]=min( RMQ[i][j-1], RMQ[i+jdx][j-1] );
    }
    ofstream out( "rmq.out" );
    for( ; M; --M )
    {
        in>>i>>j;
        jdx=Log2( j-i+1 );
        out<<min( RMQ[i][jdx], RMQ[j-(1<<jdx)+1][jdx] )<<'\n';
    }
    return EXIT_SUCCESS;
}