Cod sursa(job #492247)

Utilizator BitOneSAlexandru BitOne Data 13 octombrie 2010 21:22:47
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
/* 
 * File:   main.cpp
 * Author: bitone
 *
 * Created on October 13, 2010, 9:04 PM
 */
#include <fstream>
#include <cstdlib>
#define MAX_N 100011
#define LOGMAX_N 17

using namespace std;

/*
 * 
 */
int RMQ[MAX_N][LOGMAX_N];
inline int log2( int N )
{
    if( N <= 0 )
        return -1;
    if( 1 == N )
        return 0;
    int r=0;
    if( N > 1<<16 )
        N>>=16, r+=16;
    if( N > 1<<8 )
        N>>=8, r+=8;
    if( N > 1<<4 )
        N>>=4, r+=4;
    if( N > 1<<2 )
        N>>=2, r+=2;
    if( N > 1<<1 )
        r+=1;
    return r;
}
int main(int argc, char** argv)
{
    int N, M, i, j, idx, jdx;
    ifstream in( "rmq.in" );
    in>>N>>M;
    for( i=1; i <= N; ++i )
        in>>RMQ[i][0];
    for( i=1; (1<<i) <= N; ++i )
    {
        idx=1<<(i-1);
        jdx=N-(idx<<1)+1;
        for( j=1; j <= jdx; ++j )
            RMQ[j][i]=min( RMQ[j][i-1], RMQ[j+idx][i-1] );
    }
    ofstream out( "rmq.out" );
    for( ; M; --M )
    {
        in>>i>>j;
        idx=log2( j-i+1 );
        jdx=1<<idx;
        out<<min( RMQ[i][idx], RMQ[j-jdx+1][idx] )<<'\n';
    }
    return EXIT_SUCCESS;
}