Cod sursa(job #388941)

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

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

}