Cod sursa(job #1518577)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 5 noiembrie 2015 23:29:33
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 100000 + 1;
const int MAX_LG = 17;

int rmq[MAX_LG][MAX_N];
int lg2[MAX_N];

int N, Q;

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

    in >> N >> Q;

    for (int i = 1; i <= N; ++i)
        in >> rmq[0][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 <= N; ++i)
        lg2[i] = lg2[i >> 1] + 1;

    while (Q--)
    {
        int x, y;
        in >> x >> y;

        int k = lg2[y - x + 1];
        int p = 1 << k;

        out << min(rmq[k][x], rmq[k][y - p + 1]) << "\n";
    }

    return 0;
}