Cod sursa(job #1248703)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 25 octombrie 2014 20:44:51
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>


typedef std::vector< std::vector<int> > matrix;

matrix preComputeRmq(std::vector<int> &v)
{
    matrix rmq_D(v.size());

    size_t lg = static_cast<std::size_t>(log(v.size())/log(2)) + 1;
    for (matrix::iterator it = rmq_D.begin(); it != rmq_D.end(); ++it)
        it->reserve(lg);

    for (std::size_t i = 0; i < v.size(); ++i)
        rmq_D[i][0] = v[i];

    for (std::size_t i = 1; i < lg; ++i)
        for (std::size_t j = 0; j + (1 << i) - 1 < v.size(); ++j)
            rmq_D[j][i] = std::min(rmq_D[j][i - 1],
                                   rmq_D[j + (1 << (i - 1))][i - 1]);

    return rmq_D;
}

int main()
{
    std::ifstream fin("rmq.in");
    freopen("rmq.out", "w", stdout);

    int N, M;
    fin >> N >> M;

    std::vector<int> v(N);
    for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
        fin >> *it;

    std::vector<int> lg(N + 1);
    for (int i = 1; i <= N; ++i)
        lg[i] = static_cast<std::size_t>(log(i));

    matrix rmq_D = preComputeRmq(v);
    for (; M--; ) {
        int i, j;
        fin >> i >> j;
        --i, --j;

        int k = lg[j - i + 1];
        printf("%d\n", std::min(rmq_D[i][k], rmq_D[j - (1 << k) + 1][k]));
    }

    fin.close();
    return 0;
}