This documentation is automatically generated by online-judge-tools/verification-helper
#include "other/min_semigroup.cpp"
#include "other/right_zero_semigroup.cpp"
#include "other/semigroup_to_monoid.cpp"
#include <optional>
template <class W> class min_assign_action {
using T = typename W::value_type;
using U = std::optional<T>;
public:
using value_structure = semigroup_to_monoid<min_semigroup<W>>;
using operator_structure = semigroup_to_monoid<right_zero_semigroup<T>>;
static constexpr U operation(const U &l, const U &r) noexcept {
return r ? r : l;
}
};
#line 1 "other/min_semigroup.cpp"
template <class W> class min_semigroup {
using T = typename W::value_type;
public:
using value_type = T;
static constexpr T operation(const T &l, const T &r) noexcept {
return W::compare(l, r) ? l : r;
}
};
#line 1 "other/right_zero_semigroup.cpp"
template <class T> class right_zero_semigroup {
public:
using value_type = T;
static constexpr T operation(const T &, const T &r) noexcept { return r; }
};
#line 1 "other/semigroup_to_monoid.cpp"
#include <optional>
#include <utility>
template <class S> class semigroup_to_monoid {
using T = std::optional<typename S::value_type>;
public:
using value_type = T;
static constexpr T operation(const T &l, const T &r) noexcept {
if (!l)
return r;
if (!r)
return l;
return T(std::in_place, S::operation(*l, *r));
}
static constexpr T identity{std::nullopt};
};
#line 4 "other/min_assign_action.cpp"
#line 6 "other/min_assign_action.cpp"
template <class W> class min_assign_action {
using T = typename W::value_type;
using U = std::optional<T>;
public:
using value_structure = semigroup_to_monoid<min_semigroup<W>>;
using operator_structure = semigroup_to_monoid<right_zero_semigroup<T>>;
static constexpr U operation(const U &l, const U &r) noexcept {
return r ? r : l;
}
};