Cod sursa(job #1321986)

Utilizator gedicaAlpaca Gedit gedica Data 19 ianuarie 2015 18:31:22
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
#include <algorithm>

const int NMAX= 100000;

using namespace std;

ifstream in( "rmq.in" );
ofstream out( "rmq.out" );

int dp[NMAX+1][20], a[NMAX+1], v[NMAX+1];

int main()
{
    int N, M;

    in >> N >> M;

    for( int i= 1; i<=N; ++i )
    {
        in >> a[i];
    }

    for( int i= 1; i<=N; ++i )
    {
        dp[i][0]= a[i];
    }

    for( int j= 1; ( 1<<j )<=N; ++j )
    {
        for( int i= 1; i<=N-( 1<<j ) + 1; ++i )
        {
            dp[i][j]= min( dp[i][ j-1 ], dp[ i + ( 1<<(j-1) ) ][ j-1 ] );
        }
    }

    v[1]=0;

    for( int i= 2; i<=N; ++i )
    {
        v[i]= v[i/2]+1;
    }

    int x, y, k;

    for( int i= 1; i<=M; ++i )
    {
        in >> x >> y;

        k= v[y-x+1];

        out << min( dp[x][k] ,dp[ y-( 1<<k )+1 ][k] ) << '\n';

    }
    return 0;
}