Cod sursa(job #2869252)

Utilizator the_horoHorodniceanu Andrei the_horo Data 11 martie 2022 13:30:57
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <algorithm>
#include <array>
#include <cmath>
#include <cstdint>
#include <fstream>
#include <vector>


using u32 = uint32_t;
using i32 = int32_t;


std::vector<std::vector<u32>> rmq;
std::vector<u32> values;


void build () {
    rmq.emplace_back(values);

    size_t i = 1;
    size_t step = 2;

    for (; step < values.size(); ++ i, step <<= 1) {
        rmq.emplace_back();
        for (size_t j = 0; j + step - 1 < values.size(); ++ j)
            rmq[i].emplace_back(std::min(rmq[i - 1][j], rmq[i - 1][j + step / 2]));
    }
}


u32 query (size_t left, size_t right) {
    size_t log = std::log2(right - left);
    size_t step = 1 << log;

    return std::min(rmq[log][left], rmq[log][right - step]);
}


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

    u32 queries;
    {
        size_t valueCount;
        in >> valueCount >> queries;

        values.resize(valueCount);

        for (auto &value: values)
            in >> value;
    }

    build();

    for (u32 i = 0; i != queries; ++ i) {
        size_t left, right;
        in >> left >> right;
        -- left, -- right;

        out << query(left, right + 1) << '\n';
    }
}