#pragma once
template<typenameX>structMonoidMaxIndex{usingP=std::pair<X,int>;usingvalue_type=P;staticconstexprPop(constP&x,constP&y)noexcept{returnstd::max(x,y);}staticconstexprvoidRchop(P&x,constP&y){if(x<y)x=y;}staticconstexprvoidLchop(constP&x,P&y){if(y<x)y=x;}staticconstexprPunit(){returnP(std::numeric_limits<X>::min()/2,-1);}staticconstexprboolcommute=true;staticconstexprstd::vector<P>arrange(conststd::vector<X>&v){std::vector<P>w(v.size());for(inti=0;i<v.size();i++)w[i]=P(v[i],i);returnw;}};