Cod sursa(job #999937)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 21 septembrie 2013 18:39:34
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 100005;
const int LgMax = 18;

int N, M;
int A[Nmax], rmq[LgMax][Nmax], lg[Nmax];

void RMQ()
{
    for ( int i = 1; i <= N; ++i )
            rmq[0][i] = A[i];

    for ( int i = 1; ( 1 << i ) <= N; ++i )
            for ( int j = 1; j + ( 1 << i ) - 1 <= N; ++j )
            {
                int p = 1 << ( i - 1 );

                rmq[i][j] = min( rmq[i - 1][j], rmq[i - 1][j + p] );
            }

    for ( int i = 2; i < Nmax; ++i )
            lg[i] = lg[i / 2] + 1;
}

int main()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");

    f >> N >> M;

    for ( int i = 1; i <= N; ++i )
            f >> A[i];

    RMQ();

    for ( int i = 1; i <= M; ++i )
    {
        int st, dr;

        f >> st >> dr;

        int diff = dr - st + 1;
        int k = lg[diff];
        int p = 1 << k;
        int sh = diff - p;

        g << min ( rmq[k][st], rmq[k][st + sh] ) << "\n";
    }

    return 0;
}