Pagini recente » Cod sursa (job #1608536) | Cod sursa (job #1432745) | Cod sursa (job #587449) | Cod sursa (job #325950) | Cod sursa (job #2869252)
#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';
}
}