Cod sursa(job #524190)

Utilizator BitOneSAlexandru BitOne Data 20 ianuarie 2011 17:01:49
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 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 )
{
    return (8*sizeof(int)-1)-(__builtin_clz(N));
}
int main(int argc, char** argv)
{
    int N, log2N, M, i, j, k, c;
    ifstream in( "rmq.in" );
    in>>N>>M;
    log2N=log2(N);
    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;
}