Cod sursa(job #389038)

Utilizator alexandru92alexandru alexandru92 Data 31 ianuarie 2010 18:15:48
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on January 31, 2010, 1:56 PM
 */
#include <fstream>
#define Nmax 100000
#define Log2Nmax 19

/*
 *
 */
using namespace std;
int RMQ[Nmax][Log2Nmax];
inline int min( int x, int y )
{
    return y^( (x^y) & -(x<y) );
}
inline int Log2( int n )
{
    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;
    if( !rez )
        rez=-1;
    return rez;
}
int main()
{int n, m, i, j, c, c2, log2l;
    ifstream in("rmq.in");
    in>>n>>m;
    for( i=0; i < n; ++i )
        in>>RMQ[i][0];
    for( j=1; (1<<j) <= n; ++j )
    {   c2=(1<<j);
        c=(1<<(j-1));
        for( i=0; i+c2-1 < n; ++i )
            RMQ[i][j]=min( RMQ[i][j-1], RMQ[i+c][j-1] );
    }
    ofstream out("rmq.out");
    for( c=1; c <= m; ++c )
    {
        in>>i>>j;
        log2l=Log2( j-i+1 );
        out<<min( RMQ[i-1][log2l], RMQ[j-(1<<(log2l))][log2l]   )<<'\n';
    }
    return 0;
}