#pragma once
template<typenameX>structMonoidMax{usingvalue_type=X;staticconstexprXop(constX&x,constX&y)noexcept{returnstd::max(x,y);}staticconstexprvoidRchop(X&x,constX&y){if(x<y)x=y;}staticconstexprvoidLchop(constX&x,X&y){if(y<x)y=x;}staticconstexprXunit(){returnstd::numeric_limits<X>::min()/2;}staticconstexprboolcommute=true;};