#pragma once
// 合成の順番は関数と一緒だよtemplate<typenameX>structMonoidSet{usingO=std::optional<X>;usingvalue_type=O;staticconstexprOop(constO&x,constO&y)noexcept{return(x.has_value()?x:y);}staticconstexprvoidRchop(O&x,constO&y){if(!x)x=y;}staticconstexprvoidLchop(constO&x,O&y){if(x)y=x;}staticconstexprOunit()noexcept{returnstd::nullopt;}staticconstexprboolcommute=false;};