Cod sursa(job #437034)

Utilizator alexandru92alexandru alexandru92 Data 9 aprilie 2010 09:38:31
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
/* 
 * File:   main.cpp
 * Author: VirtualDemon
 *
 * Created on April 9, 2010, 8:52 AM
 */
#include <cstdlib>
#include <fstream>
#define Nmax 100001
#define Log2Nmax 20

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