Cod sursa(job #941858)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 19 aprilie 2013 22:00:34
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 100010;

int N;
int V[MAXN], RMQ[18][MAXN];
int Log[MAXN];

void Build_Log ()
{
    int i;

    for (i = 2; i <= N; i ++)
        Log[i] = Log[i / 2] + 1;
}

void Build_RMQ ()
{
    int i, j, a, b;

    for (i = 1; i <= N; i ++)
        RMQ[0][i] = i;

    for (j = 1; (1 << j) <= N; j ++)
        for (i = 1; i + (1 << j) - 1 <= N; i ++){
            a = RMQ[j - 1][i];
            b = RMQ[j - 1][i + (1 << (j - 1))];

            if (V[a] <= V[b])
                RMQ[j][i] = a;
            else
                RMQ[j][i] = b;
        }
}

int Solve (int x, int y)
{
    if (y < x)
        swap (x, y);

    int dif = y - x + 1;
    int log = Log[dif];
    int a, b;
    a = RMQ[log][x];
    b = RMQ[log][y - (1 << log) + 1];

    if (V[a] <= V[b])
        return a;
    else
        return b;
}

int main()
{
    int M, i, x, y;

    in >> N >> M;
    for (i = 1; i <= N; i ++)
        in >> V[i];

    Build_Log ();
    Build_RMQ ();

    while (M --){
        in >> x >> y;
        out << V[Solve (x, y)] << "\n";
    }

    return 0;
}