Cod sursa(job #1339252)

Utilizator Edsger.DijkstraEdsger Wybe Dijkstra Edsger.Dijkstra Data 10 februarie 2015 19:38:51
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 100010;

int RMQ[17][MAXN];
int Log[MAXN];

inline int mn (const int &A, const int &B)
{
    if (A < B)
        return A;

    return B;
}

int main()
{
    int N, M, i, j;
    int a, b;
    int dif;

    in >> N >> M;
    for (i = 1; i <= N; i ++){
        in >> RMQ[0][i];

        if (i != 1)
            Log[i] = Log[i >> 1] + 1;
    }

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

            RMQ[i][j] = mn (a, b);
        }

    for (i = 1; i <= M; i ++){
        in >> a >> b;
        dif = b - a + 1;
        dif = Log[dif];

        out << mn (RMQ[dif][a], RMQ[dif][b - (1 << dif) + 1]) << "\n";
    }

    return 0;
}