26template <
typename T,
bool maximum_mode = false>
struct RMQ {
27 static int highest_bit(
unsigned x) {
return x == 0 ? -1 : 31 - count_leading_zeroes(x); }
30 std::vector<T> values;
31 std::vector<std::vector<int>> range_low;
33 RMQ(
const std::vector<T>& _values = {}) {
40 int better_index(
int a,
int b)
const {
41 return (maximum_mode ? values[b] < values[a] : values[a] < values[b]) ? a : b;
44 void build(
const std::vector<T>& _values) {
46 n = int(values.size());
47 int levels = highest_bit(n) + 1;
48 range_low.resize(levels);
50 for (
int k = 0; k < levels; k++)
51 range_low[k].resize(n - (1 << k) + 1);
53 for (
int i = 0; i < n; i++)
56 for (
int k = 1; k < levels; k++)
57 for (
int i = 0; i <= n - (1 << k); i++)
59 better_index(range_low[k - 1][i], range_low[k - 1][i + (1 << (k - 1))]);
63 int query_index(
int a,
int b)
const {
64 assert(0 <= a && a < b && b <= n);
65 int level = highest_bit(b - a);
66 return better_index(range_low[level][a], range_low[level][b - (1 << level)]);
69 T query_value(
int a,
int b)
const {
return values[query_index(a, b)]; }