This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub noshi91/Library
#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; } };