Cod sursa(job #715875)

Utilizator BitOneSAlexandru BitOne Data 17 martie 2012 21:26:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
#define LOG2N_MAX 19

using namespace std;

int RMQ[LOG2N_MAX][N_MAX];

inline int _min( int x, int y ) { return x <= y ? x : y; }
inline int log2(int x ) { return 8*sizeof(int)-1-__builtin_clz(x); }
int main()
{
    int N, M, i, j, jAnt, till,  k, x, y;
    ifstream in( "rmq.in" );
    ofstream out( "rmq.out" );

    in>>N>>M;
    for( i=0; i < N; ++i )
       in>>RMQ[0][i];
    for( i=1, j=2, jAnt=1; j <= N; ++i, jAnt=j, j<<=1 )
    {
       till=N-j;
       for( k=0; k <= till; ++k )
           RMQ[i][k]=_min( RMQ[i-1][k], RMQ[i-1][k+jAnt] );
    }
    while( M-- )
    {
        in>>x>>y;
	--x, --y;
        k=log2(y-x+1);
        out<<_min( RMQ[k][x], RMQ[k][y-(1<<k)+1] )<<'\n';
    }

    return EXIT_SUCCESS;
}