This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
#include "monoids/linear_function_plus_count_action.hpp"
#pragma once #include <utility> #include "../monoids/linear_function.hpp" /** * @note lazy_propagation_segment_tree<plus_count_monoid<T>, linear_function_monoid<T>, linear_function_plus_count_action<T> > */ template <class T> struct linear_function_plus_count_action { typename plus_count_monoid<T>::value_type operator () (typename linear_function_monoid<T>::value_type f, typename plus_count_monoid<T>::value_type x) const { return std::make_pair(f.first * x.first + f.second * x.second, x.second); } };
#line 2 "monoids/linear_function_plus_count_action.hpp" #include <utility> #line 3 "monoids/linear_function.hpp" template <class CommutativeRing> struct linear_function_monoid { typedef std::pair<CommutativeRing, CommutativeRing> value_type; linear_function_monoid() = default; value_type unit() const { return std::make_pair(1, 0); } value_type mult(value_type g, value_type f) const { CommutativeRing fst = g.first * f.first; CommutativeRing snd = g.second + g.first * f.second; return std::make_pair(fst, snd); } }; #line 4 "monoids/linear_function_plus_count_action.hpp" /** * @note lazy_propagation_segment_tree<plus_count_monoid<T>, linear_function_monoid<T>, linear_function_plus_count_action<T> > */ template <class T> struct linear_function_plus_count_action { typename plus_count_monoid<T>::value_type operator () (typename linear_function_monoid<T>::value_type f, typename plus_count_monoid<T>::value_type x) const { return std::make_pair(f.first * x.first + f.second * x.second, x.second); } };