Cod sursa(job #1220112)

Utilizator lucian666Vasilut Lucian lucian666 Data 16 august 2014 15:09:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb


#include <fstream>
#include <algorithm>
#include <cmath>

#define MAXN 100009
#define LOGN 20

using namespace std;
ofstream out("rmq.out");
ifstream in("rmq.in");

int n , m , dp[MAXN][LOGN];

void read();
void RMQ();
void wrs();


int main()
{

    read();
    RMQ();

    /*
    for( int i=1 ; i<=n ;++i )
    {
        for( int j = 0;  j<=n ; ++j )
            out << dp[i][j] << " ";
        out << '\n';
    }
    */

    wrs();

    return 0;

}

void read()
{

    in >> n >> m;
    for( int i = 1 ; i <=n ; ++i )
    {
        int x;
        in >> x;
        dp[i][0] = x; //initializare
    }

}

void RMQ()
{

    //a[i][j] - reprezinta un interval care incepe de pe pozitia i si are lungimea 2 ^ j .

    int k = 0 ;

    while( ( 1 << k ) <= n )
        ++k;

    --k;

    for( int j = 1 ; j <=k ; ++j )
    {

        for( int i=1 ; i<=n ; i++)
        {

            dp[i][j] = dp[i][j-1];

                if( i + ( 1 << ( j - 1 ) ) <=n ) // ma incadrez in interval
                    dp[i][j] = min ( dp[i][j] , dp[ i + ( 1 << ( j - 1 ) ) ][ j - 1 ]);


        }

    }

}

void wrs()
{

    for( int i , j ; m ; --m )
    {

        in >> i >> j;
        if( i == j )
            out << dp[i][0] << '\n';
        else
        {

        int k = floor( log( j - i )/ log(2) );
        out << min ( dp[i][k] , dp[ j - ( 1 << k ) + 1 ][k] ) << '\n';

        }

    }


}