This documentation is automatically generated by online-judge-tools/verification-helper
#include "group/monoid-action/min-add.hpp"
#pragma once
#include "group/monoid/add.hpp"
#include "group/monoid/min.hpp"
/**
* Author: Teetat T.
* Date: 2024-04-14
* Description: Add to Min Action class.
*/
template<class T>
struct MinAddAction{
using InfoMonoid = MinMonoid<T>;
using TagMonoid = AddMonoid<T>;
using Info = typename InfoMonoid::value_type;
using Tag = typename TagMonoid::value_type;
static constexpr Info op(const Info &a,const Tag &b){
return (a==InfoMonoid::unit()?a:(a+b));
}
};
#line 2 "group/monoid/add.hpp"
/**
* Author: Teetat T.
* Date: 2024-04-14
* Description: Add Monoid class.
*/
template<class T>
struct AddMonoid{
using value_type = T;
static constexpr T op(const T &x,const T &y){return x+y;}
static constexpr T inverse(const T &x){return -x;}
static constexpr T unit(){return T(0);}
};
#line 2 "group/monoid/min.hpp"
/**
* Author: Teetat T.
* Date: 2024-04-14
* Description: Min Monoid class.
*/
template<class T>
struct MinMonoid{
using value_type = T;
static constexpr T op(const T &x,const T &y){return min(x,y);}
static constexpr T unit(){return numeric_limits<T>::max();}
};
#line 4 "group/monoid-action/min-add.hpp"
/**
* Author: Teetat T.
* Date: 2024-04-14
* Description: Add to Min Action class.
*/
template<class T>
struct MinAddAction{
using InfoMonoid = MinMonoid<T>;
using TagMonoid = AddMonoid<T>;
using Info = typename InfoMonoid::value_type;
using Tag = typename TagMonoid::value_type;
static constexpr Info op(const Info &a,const Tag &b){
return (a==InfoMonoid::unit()?a:(a+b));
}
};