12concept Monoid =
requires(
const T &a,
const T &b) {
13 { T::id() } -> same_as<T>;
14 { a.merge(b) } -> same_as<T>;
17template <
typename L,
typename T>
18concept Lazy =
requires(
const L &lz,
const T &x,
const int len) {
19 { lz.apply(x, len) } -> same_as<T>;
25template <
bool is_min,
typename T>
struct limits;
26template <
bool is_min,
typename T>
29template <
integral T>
struct limits<true, T> {
30 static constexpr T
value = numeric_limits<T>::min() / 2;
32template <
integral T>
struct limits<false, T> {
33 static constexpr T
value = numeric_limits<T>::max() / 2;
36 static constexpr __int128
value = (__int128)numeric_limits<long long>::min() /
37 2 * numeric_limits<long long>::max() / 2;
40 static constexpr __int128
value = (__int128)numeric_limits<long long>::max() /
41 2 * numeric_limits<long long>::max() / 2;
44template <
bool is_min,
typename A,
typename B>
46 static constexpr pair<A, B>
value =
50template <
bool is_min,
typename Head,
typename... Tail>
51struct limits<is_min, tuple<Head, Tail...>> {
52 static constexpr tuple<Head, Tail...>
value = tuple_cat(
55template <
bool is_min>
struct limits<is_min, tuple<>> {
56 static constexpr tuple<>
value = make_tuple();
101 T
apply(
const T &o,
const int len)
const {
return o; }
Definition standard_monoids.hpp:18
Definition standard_monoids.hpp:12
Definition standard_monoids.hpp:23
const bool MAX_FLAG
Definition standard_monoids.hpp:24
constexpr T limits_v
Definition standard_monoids.hpp:27
const bool MIN_FLAG
Definition standard_monoids.hpp:24
Definition standard_monoids.hpp:67
static MaxMonoid id()
Definition standard_monoids.hpp:69
T v
Definition standard_monoids.hpp:68
MaxMonoid merge(const MaxMonoid &o) const
Definition standard_monoids.hpp:72
Definition standard_monoids.hpp:60
MinMonoid merge(const MinMonoid &o) const
Definition standard_monoids.hpp:65
T v
Definition standard_monoids.hpp:61
static MinMonoid id()
Definition standard_monoids.hpp:62
Lazy that does not apply any updates.
Definition standard_monoids.hpp:98
T apply(const T &o, const int len) const
Definition standard_monoids.hpp:101
static NoLazy id()
Definition standard_monoids.hpp:99
NoLazy merge(const NoLazy &o) const
Definition standard_monoids.hpp:100
Definition standard_monoids.hpp:74
SumMonoid merge(const SumMonoid &o) const
Definition standard_monoids.hpp:77
T v
Definition standard_monoids.hpp:75
static SumMonoid id()
Definition standard_monoids.hpp:76
Only stores a value, and does not have a binary operation.
Definition standard_monoids.hpp:88
ValueMonoid merge(const ValueMonoid &o) const
Definition standard_monoids.hpp:91
static ValueMonoid id()
Definition standard_monoids.hpp:90
T v
Definition standard_monoids.hpp:89
static constexpr __int128 value
Definition standard_monoids.hpp:40
static constexpr __int128 value
Definition standard_monoids.hpp:36
static constexpr T value
Definition standard_monoids.hpp:33
static constexpr pair< A, B > value
Definition standard_monoids.hpp:46
static constexpr tuple< Head, Tail... > value
Definition standard_monoids.hpp:52
static constexpr tuple value
Definition standard_monoids.hpp:56
static constexpr T value
Definition standard_monoids.hpp:30
Definition standard_monoids.hpp:25