cai_lw's competitive programming library
 
Loading...
Searching...
No Matches
sparse_table.hpp
1#pragma once
2
3#include <cstdint>
4#include <utility>
5#include <vector>
6
7#include "cplib/port/bit.hpp"
8
9namespace cplib {
10
18template <typename T, typename Op>
20 public:
21 using size_type = std::size_t;
22
24 SparseTable() = default;
25
27 SparseTable(const std::vector<T>& data) : op() {
28 table.emplace_back(data);
29 _build();
30 }
31
33 SparseTable(std::vector<T>&& data) : op() {
34 table.emplace_back(std::move(data));
35 _build();
36 }
37
43 template <typename InputIt>
44 SparseTable(InputIt first, InputIt last) : op() {
45 table.emplace_back(first, last);
46 _build();
47 }
48
50 size_type size() const { return table[0].size(); }
51
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);
63 if (left == left2)
64 return table[level][left];
65 else
66 return op(table[level][left], table[level][left2]);
67 }
68
69 private:
70 std::vector<std::vector<T>> table;
71 Op op;
72
73 void _build() {
74 size_type input_size = table.back().size();
75 while (input_size > (size_type(1) << table.size()) - 1) {
76 int level = table.size();
77 table.emplace_back();
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))]));
82 }
83 }
84 }
85};
86
87} // namespace cplib
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.