This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
#include "monoids/plus_max_action.hpp"
#pragma once #include "../monoids/plus.hpp" #include "../monoids/max.hpp" /** * @note lazy_propagation_segment_tree<max_monoid<T>, plus_monoid<T>, plus_max_action<T> > is a starry sky tree */ template <class T> struct plus_max_action { typename max_monoid<T>::value_type operator () (typename plus_monoid<T>::value_type f, typename max_monoid<T>::value_type x) const { return (x == max_monoid<T>().unit() ? x : f + x); } };
#line 2 "monoids/plus.hpp" template <class T> struct plus_monoid { typedef T value_type; value_type unit() const { return value_type(); } value_type mult(value_type a, value_type b) const { return a + b; } }; #line 2 "monoids/max.hpp" #include <algorithm> #include <limits> template <class T> struct max_monoid { typedef T value_type; value_type unit() const { return std::numeric_limits<T>::lowest(); } value_type mult(value_type a, value_type b) const { return std::max(a, b); } }; #line 4 "monoids/plus_max_action.hpp" /** * @note lazy_propagation_segment_tree<max_monoid<T>, plus_monoid<T>, plus_max_action<T> > is a starry sky tree */ template <class T> struct plus_max_action { typename max_monoid<T>::value_type operator () (typename plus_monoid<T>::value_type f, typename max_monoid<T>::value_type x) const { return (x == max_monoid<T>().unit() ? x : f + x); } };