7#include "cplib/port/bit.hpp"
18template <
typename T,
typename Op>
21 using size_type = std::size_t;
28 table.emplace_back(data);
34 table.emplace_back(std::move(data));
43 template <
typename InputIt>
45 table.emplace_back(first, last);
50 size_type
size()
const {
return table[0].size(); }
60 T
range(size_type left, size_type right)
const {
61 int level = port::bit_width(right - left) - 1;
62 size_type left2 = right - (size_type(1) << level);
64 return table[level][left];
66 return op(table[level][left], table[level][left2]);
70 std::vector<std::vector<T>> table;
74 size_type input_size = table.back().size();
75 while (input_size > (size_type(1) << table.size()) - 1) {
76 int level = table.size();
78 size_type level_size = input_size + 1 - (size_type(1) << level);
79 table.back().reserve(level_size);
80 for (size_type i = 0; i < level_size; i++) {
81 table.back().push_back(op(table[level - 1][i], table[level - 1][i + (size_type(1) << (level - 1))]));
sparse table for certain binary operations like min and gcd.
Definition: sparse_table.hpp:19
size_type size() const
Returns number of elements in the sequence.
Definition: sparse_table.hpp:50
T range(size_type left, size_type right) const
Iterated application of operator Op on elements in the 0-based half-open range [left,...
Definition: sparse_table.hpp:60
SparseTable(const std::vector< T > &data)
Construct the sparse table from the given sequence.
Definition: sparse_table.hpp:27
SparseTable(InputIt first, InputIt last)
Construct the sparse table from the given sequence.
Definition: sparse_table.hpp:44
SparseTable(std::vector< T > &&data)
Construct the sparse table from the given sequence.
Definition: sparse_table.hpp:33
SparseTable()=default
Creates an empty sparse table.