27template <
class Impl,
class Value>
33 static constexpr std::size_t
npos = std::numeric_limits<std::size_t>::max();
40 std::size_t
size()
const {
return impl().size_impl(); }
60 std::size_t
arg_min(std::size_t left, std::size_t right)
const {
61 return impl().arg_min_impl(left, right);
73 Value
range_min(std::size_t left, std::size_t right)
const {
74 const std::size_t position =
arg_min(left, right);
75 if (position ==
npos) {
78 return impl().value_at_impl(position);
90 requires requires(const Impl& concrete) {
92 concrete.memory_usage_bytes_impl()
93 } -> std::convertible_to<std::size_t>;
96 return impl().memory_usage_bytes_impl();
105 const Impl& impl()
const {
return static_cast<const Impl&
>(*this); }
CRTP facade for static range-minimum-query indexes.
Definition rmq.h:28
Value range_min(std::size_t left, std::size_t right) const
Return the minimum value in [left, right).
Definition rmq.h:73
std::size_t size() const
Number of indexed values.
Definition rmq.h:40
std::size_t memory_usage_bytes() const
Return owned auxiliary memory usage in bytes when implemented.
Definition rmq.h:89
std::size_t arg_min(std::size_t left, std::size_t right) const
Return the first minimum position in [left, right).
Definition rmq.h:60
static constexpr std::size_t npos
Sentinel returned when no valid query answer exists.
Definition rmq.h:33
bool empty() const
Whether the indexed array is empty.
Definition rmq.h:47