Cod sursa(job #524193)

Utilizator BitOneSAlexandru BitOne Data 20 ianuarie 2011 17:03:57
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
/* 
 * File:   main.cpp
 * Author: salexandru
 *
 * Created on January 20, 2011, 4:18 PM
 */
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
#define LOGN_MAX 17

using namespace std;

/*
 * 
 */
int RMQ[N_MAX][LOGN_MAX];
inline int log2( int N )
{
    int log=(8*sizeof(int)-1)-(__builtin_clz(N));
    if( 0 == ( N & (N-1) ) )
        return log-1;
    return log;
}
int main(int argc, char** argv)
{
    int N, log2N, M, i, j, k, c;
    ifstream in( "rmq.in" );
    in>>N>>M;
    log2N=log2(N)+1;
    for( i=1; i <= N; ++i )
        in>>RMQ[0][i];
    for( j=1; (1<<j) <= N; ++j )
    {
        c=N-(1<<j)+1;
        k=1<<(j-1);
        for( i=1; i <= c; ++i )
            RMQ[j][i]=min( RMQ[j-1][i], RMQ[j-1][i+k] );
    }
    ofstream out( "rmq.out" );
    for( ; M; --M )
    {
        in>>i>>j;
        k=log2( j-i+1 );
        out<<min( RMQ[k][i], RMQ[k][j-(1<<k)+1] )<<'\n';
    }
    return 0;
}