This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
#include "monoids/left_action.hpp"
#pragma once
#include <utility>
#include "../monoids/left.hpp"
/**
* @note lazy_propagation_segment_tree<left_monoid<typename Monoid::value_type>, Monoid, left_action<Monoid> > is the same to dual_segment_tree<Monoid>
*/
template <class Monoid>
struct left_action {
typename left_monoid<typename Monoid::value_type>::value_type operator () (typename Monoid::value_type f, typename left_monoid<typename Monoid::value_type>::value_type x) const {
return x.first ? std::make_pair(true, Monoid().mult(f, x.second)) : x;
}
};
#line 2 "monoids/left_action.hpp"
#include <utility>
#line 3 "monoids/left.hpp"
template <class T>
struct left_monoid {
// typedef std::optional<T> value_type;
typedef std::pair<bool, T> value_type;
value_type unit() const { return std::make_pair(false, T()); }
value_type mult(value_type a, value_type b) const { return a.first ? a : b; }
};
#line 4 "monoids/left_action.hpp"
/**
* @note lazy_propagation_segment_tree<left_monoid<typename Monoid::value_type>, Monoid, left_action<Monoid> > is the same to dual_segment_tree<Monoid>
*/
template <class Monoid>
struct left_action {
typename left_monoid<typename Monoid::value_type>::value_type operator () (typename Monoid::value_type f, typename left_monoid<typename Monoid::value_type>::value_type x) const {
return x.first ? std::make_pair(true, Monoid().mult(f, x.second)) : x;
}
};