Cod sursa(job #1742145)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 15 august 2016 20:46:20
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

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

class RangeMinimumQuery
{
private:

    vector< vector<int> > rmq;
    vector<int> _log2;
    int N;

public:

    RangeMinimumQuery(int N)
    {
        this->N = N;
        rmq.resize(17);

        for (int i = 0; i < rmq.size(); ++i)
            rmq.resize(N + 1);

        _log2.resize(N + 1);
    }

    void setIndex(int index, int key)
    {
        rmq[0][index] = key;
    }

    void build()
    {
        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]);
            }

        _log2[1] = 0;

        for (int i = 2; i <= N; ++i)
            _log2[i] = _log2[i >> 1] + 1;
    }

    int query(int x, int y)
    {
        int dif = y - x + 1;
        int k = _log2[dif];

        return min(rmq[k][x] , rmq[k][y - (1 << k) + 1]);
    }
};

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

    int N, Q;
    in >> N >> Q;

    RangeMinimumQuery rmq(N);

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

        rmq.setIndex(i, x);
    }

    rmq.build();

    while (Q--)
    {
        int x, y;
        in >> x >> y;
        out << rmq.query(x, y) << "\n";
    }

    return 0;
}