結果

問題 No.3265 地元に帰れば天才扱い!
ユーザー 👑 p-adic
提出日時 2025-09-08 09:38:38
言語 C++17(gcc12)
(gcc 12.3.0 + boost 1.87.0)
結果
AC  
実行時間 429 ms / 2,500 ms
コード長 51,243 bytes
コンパイル時間 13,415 ms
コンパイル使用メモリ 258,168 KB
実行使用メモリ 9,472 KB
最終ジャッジ日時 2025-09-08 09:39:07
合計ジャッジ時間 28,167 ms
ジャッジサーバーID
(参考情報)
judge / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 21
権限があれば一括ダウンロードができます

ソースコード

diff #

#ifndef INCLUDE_MODE
  #define INCLUDE_MODE
  /* #define SUBMIT_ONLY */
  #define DEBUG_OUTPUT
  #define SAMPLE_CHECK G
#endif
#ifdef INCLUDE_MAIN

VO Solve()
{

  CIN( int , N , M );
  CIN_A( T3<int> , 0 , N , ALR );
  FOR( i , 0 , N ){
    ALR[i][I]--; ALR[i][II]--;
  }
  CIN( int , Q ); // 入力受け取り順に注意







  vector<int> pos = id<int>( N );
  BIT<ll> bit( M );
  IntervalInsertNonNegativeLineMultiSubset S{ M };
  FOR( i , 0 , N ){
    auto& [A,L,R] = ALR[i];
    bit.Add( i , A );
    S.IntervalInsert( L , R , 1 );
  }
  ll a = 0;
  FOR( i , 0 , N ){
    auto& [A,L,R] = ALR[i];
    a += A * ll( R - L + 1 ) - bit.IntervalSum( L , R);
  }
  auto ScoreDiff = [&]( const int& i ){
    auto& [A,L,R] = ALR[i];
    return A * ll( R - L + 1 - S.count( pos[i] ) ) - bit.IntervalSum( L , R ) + ( L <= pos[i] && pos[i] <= R ? A : 0 );
  };
  FOR( q , 0 , Q ){
    CIN( int , X , Y , l , r ); --X; --Y; --l; --r;
    auto& [A,L,R] = ALR[X];
    a -= ScoreDiff( X );
    bit.Add( pos[X] , -A );
    S.IntervalErase( L , R , 1 );
    pos[X] = Y;
    L = l;
    R = r;
    S.IntervalInsert( L , R , 1 );
    bit.Add( pos[X] , A );
    a += ScoreDiff( X );
    COUT( a );
  }

  
  

}
REPEAT_MAIN(1);

#else /* INCLUDE_MAIN */
#ifdef INCLUDE_SUB



/* 圧縮時は中身だけ削除する。*/
IN VO Experiment()
{
  
}

/* 圧縮時は中身だけ削除する。*/
IN VO SmallTest()
{

  CERR( "全ての出力が一致しました。" );
}

/* 圧縮時は中身だけ削除する。*/
IN VO RandomTest( const int& test_case_num )
{
  REPEAT( test_case_num ){

  }
  CERR( "全ての出力が一致しました。" );
}

#define INCLUDE_MAIN
#include __FILE__
#else /* INCLUDE_SUB */
#ifdef INCLUDE_LIBRARY

/* VVV 常設でないライブラリは以下に挿入する。*/

#ifdef DEBUG
  #include "c:/Users/user/Documents/Programming/Mathematics/SetTheory/Line/Bounded/NonNegative/Multisubset/IntervalInsert/Debug/a_Body.hpp"
#else
#define SFINAE_FOR_BIT_BS enable_if_t<is_invocable_r_v<bool,F,U,int>>*
TE <TY U,TY ABELIAN_GROUP>CL AbstractBIT{PU:ABELIAN_GROUP m_M;int m_SZ;VE<U> m_fenwick;int m_PW;IN AbstractBIT(ABELIAN_GROUP M,CRI SZ = 0);IN AbstractBIT(ABELIAN_GROUP M,CO VE<U>& a);TE <TY...Args> IN VO Initialise(CO Args&... args);IN VO Set(CRI i,CO U& u);VO Add(CRI i,CO U& u);IN CRI SZ()CO NE;IN U OP[](CRI i);IN U Get(CRI i);IN CO U& LSBSegmentSum(CRI j)CO;U InitialSegmentSum(CRI i_final);IN U IntervalSum(CRI i_start,CRI i_final);TE <TY F,SFINAE_FOR_BIT_BS = nullptr> int Search(CO F& f);TE <TY F,SFINAE_FOR_BIT_BS = nullptr> IN int Search(CRI i_start,CO F& f);IN int Search(CO U& u);IN int Search(CRI i_start,CO U& u);IN VO COruct();};TE <TY ABELIAN_GROUP,TY...Args> AbstractBIT(ABELIAN_GROUP M,CO Args&... args)-> AbstractBIT<inner_t<ABELIAN_GROUP>,ABELIAN_GROUP>;TE <TY U = ll>CL BIT:PU AbstractBIT<U,AdditiveGroup<U>>{PU:TE <TY...Args> IN BIT(CO Args&... args);};TE <TY U> BIT(CO VE<U>& a)-> BIT<U>;
TE <TY U,TY ABELIAN_GROUP> IN AbstractBIT<U,ABELIAN_GROUP>::AbstractBIT(ABELIAN_GROUP M,CRI SZ):m_M(MO(M)),m_SZ(SZ),m_fenwick(m_SZ + 1,m_M.Zero()),m_PW(1){COruct();}TE <TY U,TY ABELIAN_GROUP> IN AbstractBIT<U,ABELIAN_GROUP>::AbstractBIT(ABELIAN_GROUP M,CO VE<U>& a):m_M(MO(M)),m_SZ(a.SZ()),m_fenwick(m_SZ + 1,m_M.Zero()),m_PW(1){COruct();for(int j = 1;j <= m_SZ;j++){U& fenwick_j = m_fenwick[j];int i = j - 1;fenwick_j = a[i];int i_lim = j -(j & -j);WH(i > i_lim){fenwick_j = m_M.Sum(MO(fenwick_j),m_fenwick[i]);i -=(i & -i);}}}TE <TY U,TY ABELIAN_GROUP> IN VO AbstractBIT<U,ABELIAN_GROUP>::COruct(){ST_AS(is_same_v<U,inner_t<ABELIAN_GROUP>>);WH(m_PW < m_SZ){m_PW <<= 1;}}TE <TY U> TE <TY...Args> IN BIT<U>::BIT(CO Args&... args):AbstractBIT<U,AdditiveGroup<U>>(AdditiveGroup<U>(),args...){}TE <TY U,TY ABELIAN_GROUP> TE <TY...Args> IN VO AbstractBIT<U,ABELIAN_GROUP>::Initialise(CO Args&... args){AbstractBIT<U,ABELIAN_GROUP> temp{m_M,args...};m_SZ = temp.m_SZ;m_fenwick = MO(temp.m_fenwick);m_PW = temp.m_PW;}TE <TY U,TY ABELIAN_GROUP> IN VO AbstractBIT<U,ABELIAN_GROUP>::Set(CRI i,CO U& u){Add(i,m_M.Sum(m_M.Inverse(IntervalSum(i,i)),u));}TE <TY U,TY ABELIAN_GROUP>VO AbstractBIT<U,ABELIAN_GROUP>::Add(CRI i,CO U& u){int j = i + 1;WH(j <= m_SZ){U& fenwick_j = m_fenwick[j];fenwick_j = m_M.Sum(MO(fenwick_j),u);j +=(j & -j);}RE;}TE <TY U,TY ABELIAN_GROUP> IN CRI AbstractBIT<U,ABELIAN_GROUP>::SZ()CO NE{RE m_SZ;}TE <TY U,TY ABELIAN_GROUP> IN U AbstractBIT<U,ABELIAN_GROUP>::OP[](CRI i){AS(0 <= i && i < m_SZ);RE IntervalSum(i,i);}TE <TY U,TY ABELIAN_GROUP> IN U AbstractBIT<U,ABELIAN_GROUP>::Get(CRI i){RE OP[](i);}TE <TY U,TY ABELIAN_GROUP> IN CO U& AbstractBIT<U,ABELIAN_GROUP>::LSBSegmentSum(CRI j)CO{AS(0 < j && j <= m_SZ);RE m_fenwick[j];}TE <TY U,TY ABELIAN_GROUP>U AbstractBIT<U,ABELIAN_GROUP>::InitialSegmentSum(CRI i_final){U sum = m_M.Zero();int j = min(i_final + 1,m_SZ);WH(j > 0){sum = m_M.Sum(MO(sum),m_fenwick[j]);j -= j & -j;}RE sum;}TE <TY U,TY ABELIAN_GROUP> IN U AbstractBIT<U,ABELIAN_GROUP>::IntervalSum(CRI i_start,CRI i_final){RE m_M.Sum(m_M.Inverse(InitialSegmentSum(i_start - 1)),InitialSegmentSum(i_final));}TE <TY U,TY ABELIAN_GROUP> TE <TY F,SFINAE_FOR_BIT_BS>int AbstractBIT<U,ABELIAN_GROUP>::Search(CO F& f){int j = 0;int PW = m_PW;U sum = m_M.Zero();U sum_next = sum;WH(PW > 0){int j_next = j | PW;if(j_next <= m_SZ){sum_next = m_M.Sum(MO(sum_next),m_fenwick[j_next]);if(f(sum_next,j_next - 1)){sum_next = sum;}else{sum = sum_next;j = j_next;}}PW >>= 1;}RE j;}TE <TY U,TY ABELIAN_GROUP> TE <TY F,SFINAE_FOR_BIT_BS> IN int AbstractBIT<U,ABELIAN_GROUP>::Search(CRI i_start,CO F& f){CO U u_inv = m_M.Inverse(InitialSegmentSum(i_start - 1));RE max(i_start,Search([&](CO U& sum,CRI i){RE i_start <= i && f(m_M.Sum(u_inv,sum),i);}));}TE <TY U,TY ABELIAN_GROUP> IN int AbstractBIT<U,ABELIAN_GROUP>::Search(CO U& u){RE Search([&](CO U& sum,CRI){RE !(sum < u);});}TE <TY U,TY ABELIAN_GROUP> IN int AbstractBIT<U,ABELIAN_GROUP>::Search(CRI i_start,CO U& u){RE max(i_start,Search(m_M.Sum(InitialSegmentSum(i_start - 1),u)));}TE <CL Traits,TY U,TY ABELIAN_GROUP> IN OS& OP<<(OS& os,AbstractBIT<U,ABELIAN_GROUP>& bit){auto&& SZ = bit.SZ();for(int i = 0;i < SZ;i++){(i == 0?os:os << " ")<< bit[i];}RE os;}

TE <TY U,TY Z_MODULE>CL AbstractIntervalAddBIT{PU:Z_MODULE m_M;AbstractBIT<U,Z_MODULE> m_bit_0;AbstractBIT<U,Z_MODULE> m_bit_1;AbstractIntervalAddBIT(Z_MODULE M,CRI SZ = 0);AbstractIntervalAddBIT(Z_MODULE M,CO VE<U>& a);TE <TY...Args> IN VO Initialise(CO Args&... args);IN VO Set(CRI i,CO U& u);IN VO Add(CRI i,CO U& u);IN VO IntervalAdd(CRI i_start,CRI i_final,CO U& u);IN CRI SZ()CO NE;IN U OP[](CRI i);IN U Get(CRI i);IN U InitialSegmentSum(CRI i_final);IN U IntervalSum(CRI i_start,CRI i_final);TE <TY F,SFINAE_FOR_BIT_BS = nullptr> int Search(CO F& f);TE <TY F,SFINAE_FOR_BIT_BS = nullptr> IN int Search(CRI i_start,CO F& f);IN int Search(CO U& u);IN int Search(CRI i_start,CO U& u);};TE <TY Z_MODULE> AbstractIntervalAddBIT(Z_MODULE M)-> AbstractIntervalAddBIT<inner_t<Z_MODULE>,Z_MODULE>;TE <TY U = ll>CL IntervalAddBIT:PU AbstractIntervalAddBIT<U,Module<int,U>>{PU:TE <TY...Args> IN IntervalAddBIT(CO Args&... args);};TE <TY U> IntervalAddBIT(CO VE<U>& a)-> IntervalAddBIT<U>;
TE <TY U,TY Z_MODULE> AbstractIntervalAddBIT<U,Z_MODULE>::AbstractIntervalAddBIT(Z_MODULE M,CRI SZ):m_M(MO(M)),m_bit_0(m_M,SZ),m_bit_1(m_M,SZ){}TE <TY U,TY Z_MODULE> AbstractIntervalAddBIT<U,Z_MODULE>::AbstractIntervalAddBIT(Z_MODULE M,CO VE<U>& a):m_M(MO(M)),m_bit_0(m_M),m_bit_1(m_M){CO int SZ = a.SZ();VE<U> diff(SZ,m_M.Zero());diff[0]= a[0];for(int i = 1;i < SZ;i++){diff[i]= m_M.Sum(m_M.Inverse(a[i-1]),a[i]);}m_bit_1.Initialise(diff);for(int i = 1;i < SZ;i++){U& diff_i = diff[i];diff_i = m_M.ScalarProduct(1 - i,MO(diff_i));}m_bit_0.Initialise(diff);}TE <TY U> TE <TY...Args> IN IntervalAddBIT<U>::IntervalAddBIT(CO Args&... args):AbstractIntervalAddBIT<U,Module<int,U>>(Module<int,U>(),args...){}TE <TY U,TY Z_MODULE> TE <TY...Args> IN VO AbstractIntervalAddBIT<U,Z_MODULE>::Initialise(CO Args&... args){AbstractIntervalAddBIT<U,Z_MODULE> temp{m_M,args...};m_bit_0 = MO(temp.m_bit_0);m_bit_1 = MO(temp.m_bit_1);}TE <TY U,TY Z_MODULE> IN VO AbstractIntervalAddBIT<U,Z_MODULE>::Set(CRI i,CO U& u){Add(i,m_M.Sum(m_M.Inverse(IntervalSum(i,i)),u));}TE <TY U,TY Z_MODULE> IN VO AbstractIntervalAddBIT<U,Z_MODULE>::Add(CRI i,CO U& u){AS(0 <= i && i < SZ());IntervalAdd(i,i,u);}TE <TY U,TY Z_MODULE> IN VO AbstractIntervalAddBIT<U,Z_MODULE>::IntervalAdd(CRI i_start,CRI i_final,CO U& u){CO U u_inv = m_M.Inverse(u);m_bit_0.Add(i_start,m_M.ScalarProduct((i_start - 1),u_inv));m_bit_0.Add(i_final + 1,m_M.ScalarProduct(i_final,u));m_bit_1.Add(i_start,u);m_bit_1.Add(i_final + 1,u_inv);}TE <TY U,TY Z_MODULE> IN CRI AbstractIntervalAddBIT<U,Z_MODULE>::SZ()CO NE{RE m_bit_0.SZ();}TE <TY U,TY Z_MODULE> IN U AbstractIntervalAddBIT<U,Z_MODULE>::OP[](CRI i){AS(0 <= i && i < SZ());RE IntervalSum(i,i);}TE <TY U,TY Z_MODULE> IN U AbstractIntervalAddBIT<U,Z_MODULE>::Get(CRI i){RE OP[](i);}TE <TY U,TY Z_MODULE> IN U AbstractIntervalAddBIT<U,Z_MODULE>::InitialSegmentSum(CRI i_final){RE m_M.Sum(m_bit_0.InitialSegmentSum(i_final),m_M.ScalarProduct(i_final,m_bit_1.InitialSegmentSum(i_final)));}TE <TY U,TY Z_MODULE> TE <TY F,SFINAE_FOR_BIT_BS>int AbstractIntervalAddBIT<U,Z_MODULE>::Search(CO F& f){int l = -1,r = SZ();WH(l + 1 < r){CO int m =(l + r)>> 1;(f(InitialSegmentSum(m),m)?r:l)= m;}RE r;}TE <TY U,TY Z_MODULE> TE <TY F,SFINAE_FOR_BIT_BS> IN int AbstractIntervalAddBIT<U,Z_MODULE>::Search(CRI i_start,CO F& f){CO U u_inv = m_M.Inverse(InitialSegmentSum(i_start - 1));RE max(i_start,Search([&](CO U& sum,CRI i){RE i_start <= i && f(m_M.Sum(u_inv,sum),i);}));}TE <TY U,TY Z_MODULE> IN int AbstractIntervalAddBIT<U,Z_MODULE>::Search(CO U& u){RE Search([&](CO U& sum,CRI){RE !(sum < u);});}TE <TY U,TY Z_MODULE> IN int AbstractIntervalAddBIT<U,Z_MODULE>::Search(CRI i_start,CO U& u){RE max(i_start,Search(m_M.Sum(InitialSegmentSum(i_start - 1),u)));}TE <TY U,TY Z_MODULE> IN U AbstractIntervalAddBIT<U,Z_MODULE>::IntervalSum(CRI i_start,CRI i_final){RE m_M.Sum(m_M.Inverse(InitialSegmentSum(i_start - 1)),InitialSegmentSum(i_final));}TE <CL Traits,TY U,TY Z_MODULE> IN OS& OP<<(OS& os,AbstractIntervalAddBIT<U,Z_MODULE>& bit){auto&& SZ = bit.SZ();for(int i = 0;i < SZ;i++){(i == 0?os:os << " ")<< bit[i];}RE os;}

TE <TY BLS,TY INT>CL IteratorOfBoundedLineSubset{PU:BLS* m_p;INT m_i;IN IteratorOfBoundedLineSubset(BLS& S,INT i);IN bool OP==(CO IteratorOfBoundedLineSubset<BLS,INT>& IT)CO NE;IN bool OP!=(CO IteratorOfBoundedLineSubset<BLS,INT>& IT)CO NE;IN INT OP*()CO;IN IteratorOfBoundedLineSubset<BLS,INT>& OP++();IN IteratorOfBoundedLineSubset<BLS,INT> OP++(int);IN IteratorOfBoundedLineSubset<BLS,INT>& OP--();IN IteratorOfBoundedLineSubset<BLS,INT> OP--(int);IN VO Next();IN VO Prev();IN pair<INT,INT> ConnectedComponent()CO;IN IteratorOfBoundedLineSubset<BLS,INT>& erase_from(BLS& S);};
TE <TY BLS,TY INT> IN IteratorOfBoundedLineSubset<BLS,INT>::IteratorOfBoundedLineSubset(BLS& S,INT i):m_p(&S),m_i(MO(i)){}TE <TY BLS,TY INT> IN bool IteratorOfBoundedLineSubset<BLS,INT>::OP==(CO IteratorOfBoundedLineSubset<BLS,INT>& IT)CO NE{RE m_p == IT.m_p && m_i == IT.m_i;}TE <TY BLS,TY INT> IN bool IteratorOfBoundedLineSubset<BLS,INT>::OP!=(CO IteratorOfBoundedLineSubset<BLS,INT>& IT)CO NE{RE !(*TH == IT);}TE <TY BLS,TY INT> IN INT IteratorOfBoundedLineSubset<BLS,INT>::OP*()CO{RE m_i;}TE <TY BLS,TY INT> IN IteratorOfBoundedLineSubset<BLS,INT>& IteratorOfBoundedLineSubset<BLS,INT>::OP++(){AS(m_i <= m_p->ubound());RE *TH = m_p->MinimumGt(m_i);}TE <TY BLS,TY INT> IN IteratorOfBoundedLineSubset<BLS,INT> IteratorOfBoundedLineSubset<BLS,INT>::OP++(int){auto IT = *TH;++(*TH);RE IT;}TE <TY BLS,TY INT> IN IteratorOfBoundedLineSubset<BLS,INT>& IteratorOfBoundedLineSubset<BLS,INT>::OP--(){AS(m_p->BE().m_i <= m_i);RE *TH = m_p->MaximumLt(m_i);}TE <TY BLS,TY INT> IN IteratorOfBoundedLineSubset<BLS,INT> IteratorOfBoundedLineSubset<BLS,INT>::OP--(int){auto IT = *TH;--(*TH);RE IT;}TE <TY BLS,TY INT> IN VO IteratorOfBoundedLineSubset<BLS,INT>::Next(){AS(m_i < m_p->ubound());CO INT r = m_p->RightEndPointOf(m_i);*TH = m_i <= r?m_p->MinimumGt(r):m_p->EN();}TE <TY BLS,TY INT> IN VO IteratorOfBoundedLineSubset<BLS,INT>::Prev(){AS(m_p->lbound()< m_i);CO INT l = m_p->LeftEndPointOf(m_i);*TH = l <= m_i?m_p->MaximumLt(l):m_p->EN();}TE <TY BLS,TY INT> IN pair<INT,INT> IteratorOfBoundedLineSubset<BLS,INT>::ConnectedComponent()CO{RE m_p->ConnectedComponentOf(m_i);}TE <TY BLS,TY INT> IN IteratorOfBoundedLineSubset<BLS,INT>& IteratorOfBoundedLineSubset<BLS,INT>::erase_from(BLS& S){AS(&S == m_p);auto IT_copy =(*TH)++;S.erase(IT_copy);RE *TH;}

TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR>CL VirtualBoundedLineSubset{PU:INT m_lbound;INT m_ubound;DATA_STR<INT> m_ds;US iterator = IteratorOfBoundedLineSubset<VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>,INT>;IN VO insert(CO INT& i);IN VO erase(CO INT& i)NE;IN iterator& erase(iterator& IT);IN VO clear();IN INT count(CO INT& i)NE;bool find(CO INT& i)NE;IN INT InitialSegmentCount(CO INT& i_final);IN INT IntervalCount(CO INT& i_start,CO INT& i_final);IN bool empty()NE;IN iterator BE()NE;IN iterator EN()NE;IN iterator MaximumLeq(CO INT& i,CO INT& k = 0);IN iterator MaximumLt(CO INT& i,CO INT& k = 0);IN iterator MinimumGeq(CO INT& i,CO INT& k = 0);IN iterator MinimumGt(CO INT& i,CO INT& k = 0);IN INT Maximum(CO INT& k = 0);IN INT Minimum(CO INT& k = 0);INT RightEndPointOf(CO INT& i,int d = -1,int comp_minus = -1,CO bool& in = false);INT LeftEndPointOf(CO INT& i,int d = -1,int comp_minus = -1,CO bool& in = false);IN pair<INT,INT> ConnectedComponentOf(CO INT& i,bool in = false);VE<pair<INT,INT>> GetConnectedComponent()NE;IN CO INT& lbound()CO NE;IN CO INT& ubound()CO NE;VI bool InRange(CO INT& i)= 0;VI RET_NOR Normalise(CO INT& i)= 0;VI RET_DEN Denormalise(CO decay_t<RET_NOR>& d)= 0;};
TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN VO VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::insert(CO INT& i){AS(InRange(i));m_ds.Set(Normalise(i),1);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN VO VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::erase(CO INT& i)NE{if(InRange(i)){m_ds.Set(Normalise(i),0);}}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator& VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::erase(TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator& IT){RE IT.erase_from(*TH);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN VO VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::clear(){m_ds.Initialise(m_ds.SZ());}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN INT VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::count(CO INT& i)NE{RE InRange(i)?m_ds[Normalise(i)]:0;}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN bool VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::find(CO INT& i)NE{RE count(i)> 0;}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN INT VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::InitialSegmentCount(CO INT& i_final){RE i_final < m_lbound?0:m_ds.InitialSegmentSum(Normalise(i_final));}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN INT VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::IntervalCount(CO INT& i_start,CO INT& i_final){auto&& l = Normalise(i_start);RE m_ds.IntervalSum((l < 0 || Denormalise(l)< i_start)?l + 1:l,Normalise(i_final));}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN bool VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::empty()NE{RE InitialSegmentCount(m_ubound)== 0;}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::BE()NE{RE MinimumGeq(m_lbound);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::EN()NE{RE TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator(*TH,m_ubound + 1);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::MaximumLeq(CO INT& i,CO INT& k){CO INT num = InitialSegmentCount(i)- k;if(num >= 0){CO int d = m_ds.Search([&](CO INT& sum,CRI j){RE num <= sum;});if(d < m_ds.SZ()){auto&& l = Denormalise(d);if(find(l)){RE TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator{*TH,l};}}}RE EN();}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::MaximumLt(CO INT& i,CO INT& k){CO int d = Normalise(i);if(d == 0){RE EN();}RE MaximumLeq(Denormalise(d - 1),k);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::MinimumGeq(CO INT& i,CO INT& k){CO int c = count(i);RE c > k?TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator{*TH,i}:MinimumGt(i,k - c);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::MinimumGt(CO INT& i,CO INT& k){CO INT num = InitialSegmentCount(i)+ k;CO int d = m_ds.Search([&](CO INT& sum,CRI j){RE num < sum;});if(d < m_ds.SZ()){auto&& r = Denormalise(d);if(find(r)){RE TY VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::iterator{*TH,r};}}RE EN();}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN INT VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::Maximum(CO INT& k){RE MaximumLeq(m_ubound,k);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN INT VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::Minimum(CO INT& k){RE MinimumGeq(m_lbound,k);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR>INT VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::RightEndPointOf(CO INT& i,int d,int comp_minus,CO bool& in){if(!in && !find(i)){RE i - 1;}if(d == -1){d = Normalise(i);comp_minus = d - InitialSegmentCount(i);}RE Denormalise(m_ds.Search([&](CO INT& sum,CRI j){RE d <= j && sum + comp_minus < j;})- 1);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR>INT VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::LeftEndPointOf(CO INT& i,int d,int comp_minus,CO bool& in){if(!in && !find(i)){RE i + 1;}if(d == -1){d = Normalise(i);comp_minus = d - InitialSegmentCount(i);}RE Denormalise(m_ds.Search([&](CO INT& sum,CRI j){RE d <= j ||(find(j)&& sum + comp_minus == j);}));}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN pair<INT,INT> VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::ConnectedComponentOf(CO INT& i,bool in){if(!in){in = find(i);}CO int d = Normalise(i),comp_minus = d - InitialSegmentCount(i);RE{LeftEndPointOf(i,d,comp_minus,in),RightEndPointOf(i,d,comp_minus,in)};}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR>VE<pair<INT,INT>> VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::GetConnectedComponent()NE{VE<pair<INT,INT>> AN{};INT r;for(auto IT = BE();*IT <= m_ubound;IT = MinimumGt(r)){AN.push_back({*IT,r = RightEndPointOf(*IT)});}RE AN;}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN CO INT& VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::lbound()CO NE{RE m_lbound;}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN CO INT& VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>::ubound()CO NE{RE m_ubound;}

TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR>CL AbstractBoundedLineMultiSubset:VI PU VirtualBoundedLineSubset<INT,RET_NOR,RET_DEN,DATA_STR>{PU:IN VO insert(CO INT& i,CO INT& c = 1);IN VO erase(CO INT& i,CO INT& c = 1);IN VO EraseAll(CO INT& i);INT RightEndPointOf(CO INT& i,CO bool& in = false)= delete;INT LeftEndPointOf(CO INT& i,CO bool& in = false)= delete;IN pair<INT,INT> ConnectedComponentOf(CO INT& i,bool in = false)= delete;VE<pair<INT,INT>> GetConnectedComponent()NE = delete;};
TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN VO AbstractBoundedLineMultiSubset<INT,RET_NOR,RET_DEN,DATA_STR>::insert(CO INT& i,CO INT& c){AS(TH->InRange(i)&& c >= 0);TH->m_ds.Add(TH->Normalise(i),c);}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN VO AbstractBoundedLineMultiSubset<INT,RET_NOR,RET_DEN,DATA_STR>::erase(CO INT& i,CO INT& c){AS(c >= 0);if(TH->InRange(i)){TH->m_ds.Add(TH->Normalise(i),-c);}}TE <TY INT,TY RET_NOR,TY RET_DEN,TE <TY...> TY DATA_STR> IN VO AbstractBoundedLineMultiSubset<INT,RET_NOR,RET_DEN,DATA_STR>::EraseAll(CO INT& i){if(TH->InRange(i)){TH->m_ds.Set(TH->Normalise(i),0);}}

TE <TY INT,TY RET_NOR,TY RET_DEN>CL AbstractIntervalInsertBoundedLineMultiSubset:PU AbstractBoundedLineMultiSubset<INT,RET_NOR,RET_DEN,IntervalAddBIT>{PU:IN VO IntervalInsert(CO INT& i_start,CO INT& i_final,CO INT& c = 1);IN VO IntervalErase(CO INT& i_start,CO INT& i_final,CO INT& c = 1);};
TE <TY INT,TY RET_NOR,TY RET_DEN> IN VO AbstractIntervalInsertBoundedLineMultiSubset<INT,RET_NOR,RET_DEN>::IntervalInsert(CO INT& i_start,CO INT& i_final,CO INT& c){AS(TH->InRange(i_start)&& TH->InRange(i_final)&& c >= 0);TH->m_ds.IntervalAdd(TH->Normalise(i_start),TH->Normalise(i_final),c);}TE <TY INT,TY RET_NOR,TY RET_DEN> IN VO AbstractIntervalInsertBoundedLineMultiSubset<INT,RET_NOR,RET_DEN>::IntervalErase(CO INT& i_start,CO INT& i_final,CO INT& c){AS(TH->InRange(i_start)&& TH->InRange(i_final)&& c >= 0);TH->m_ds.IntervalAdd(TH->Normalise(i_start),TH->Normalise(i_final),-c);}

TE <TY INT,TE <TY...> TY DATA_STR>CL AbstractNonNegativeLineSubset:VI PU VirtualBoundedLineSubset<INT,CO INT&,CO INT&,DATA_STR>{PU:PU:IN AbstractNonNegativeLineSubset(CO INT& ubound);IN bool InRange(CO INT& i);CE CO INT& Normalise(CO INT& i);CE CO INT& Denormalise(CO INT& d);};
TE <TY INT>US NonNegativeLineSubset = AbstractNonNegativeLineSubset<INT,BIT>;
TE <TY INT,TE <TY...> TY DATA_STR> IN AbstractNonNegativeLineSubset<INT,DATA_STR>::AbstractNonNegativeLineSubset(CO INT& ubound){AS(-1 <= ubound);TH->m_lbound = 0;TH->m_ubound = ubound;TH->m_ds.Initialise(TH->m_ubound + 1);}TE <TY INT,TE <TY...> TY DATA_STR> IN bool AbstractNonNegativeLineSubset<INT,DATA_STR>::InRange(CO INT& i){RE 0 <= i && i <= TH->m_ubound;}TE <TY INT,TE <TY...> TY DATA_STR> CE CO INT& AbstractNonNegativeLineSubset<INT,DATA_STR>::Normalise(CO INT& i){RE i;}TE <TY INT,TE <TY...> TY DATA_STR> CE CO INT& AbstractNonNegativeLineSubset<INT,DATA_STR>::Denormalise(CO INT& d){RE d;}

TE <TY INT>CL NonNegativeLineMultiSubset:PU NonNegativeLineSubset<INT>,PU AbstractBoundedLineMultiSubset<INT,CO INT&,CO INT&,BIT>{PU:IN NonNegativeLineMultiSubset(CO INT& ubound);};
TE <TY INT> IN NonNegativeLineMultiSubset<INT>::NonNegativeLineMultiSubset(CO INT& ubound):NonNegativeLineSubset<INT>(ubound){}

TE <TY INT>CL IntervalInsertNonNegativeLineMultiSubset:PU AbstractNonNegativeLineSubset<INT,IntervalAddBIT>,PU AbstractIntervalInsertBoundedLineMultiSubset<INT,CO INT&,CO INT&>{PU:IN IntervalInsertNonNegativeLineMultiSubset(CO INT& ubound);};
TE <TY INT> IN IntervalInsertNonNegativeLineMultiSubset<INT>::IntervalInsertNonNegativeLineMultiSubset(CO INT& ubound):AbstractNonNegativeLineSubset<INT,IntervalAddBIT>(ubound),AbstractIntervalInsertBoundedLineMultiSubset<INT,CO INT&,CO INT&>(){}
#endif

/* AAA 常設でないライブラリは以上に挿入する。*/

#define INCLUDE_SUB
#include __FILE__
#else /* INCLUDE_LIBRARY */
#ifdef DEBUG
  #define _GLIBCXX_DEBUG
#else
  #pragma GCC optimize ( "O3" )
  #pragma GCC optimize ( "unroll-loops" )
  #pragma GCC target ( "sse4.2,fma,avx2,popcnt,lzcnt,bmi2" )
  #define DEXPR( LL , BOUND , VALUE1 , VALUE2 ) CEXPR( LL , BOUND , VALUE1 )
  #define ASSERT( A , MIN , MAX ) AS( ( MIN ) <= A && A <= ( MAX ) )
  #define REPEAT_MAIN( BOUND ) START_MAIN; CEXPR( int , test_case_num_bound , BOUND ); int test_case_num = 1; if CE( test_case_num_bound > 1 ){ FINISH_MAIN
  #ifdef USE_GETLINE
    #define SET_SEPARATE( SEPARATOR , ... ) VariadicGetline( cin , SEPARATOR , __VA_ARGS__ )
    #define SET( ... ) SET_SEPARATE( '\n' , __VA_ARGS__ )
    #define GETLINE_SEPARATE( SEPARATOR , ... ) string __VA_ARGS__; SET_SEPARATE( SEPARATOR , __VA_ARGS__ )
    #define GETLINE( ... ) GETLINE_SEPARATE( '\n' , __VA_ARGS__ )
    #define FINISH_MAIN GETLINE( test_case_num_str ); test_case_num = stoi( test_case_num_str ); ASSERT( test_case_num , 1 , test_case_num_bound ); } REPEAT( test_case_num ){ Solve(); } }
  #else
    #define SET( ... ) VariadicCin( cin , __VA_ARGS__ )
    #define CIN( LL , ... ) LL __VA_ARGS__; SET( __VA_ARGS__ )
    #define SET_A( I , N , ... ) VariadicResize( N + I , __VA_ARGS__ ); FOR( VARIABLE_FOR_SET_A , 0 , N ){ VariadicSet( cin , VARIABLE_FOR_SET_A + I , __VA_ARGS__ ); }
    #define CIN_A( LL , I , N , ... ) VE<LL> __VA_ARGS__; SET_A( I , N , __VA_ARGS__ )
    #define CIN_AA( LL , I0 , N0 , I1 , N1 , VAR ) VE<VE<LL>> VAR( N0 + I0 ); FOR( VARIABLE_FOR_CIN_AA , 0 , N0 ){ SET_A( I1 , N1 , VAR[VARIABLE_FOR_CIN_AA + I0] ); }
    #define FINISH_MAIN SET_ASSERT( test_case_num , 1 , test_case_num_bound ); } REPEAT( test_case_num ){ Solve(); } }
  #endif
  #define SET_ASSERT( A , MIN , MAX ) SET( A ); ASSERT( A , MIN , MAX )
  #define SOLVE_ONLY 
  #define COUT( ... ) VariadicCout( cout , __VA_ARGS__ ) << ENDL
  #define COUTNS( ... ) VariadicCoutNonSep( cout , __VA_ARGS__ )
  #define CERR( ... ) 
  #define CERRNS( ... ) 
  #define COUT_A( I , N , A ) CoutArray( cout , I , N , A ) << ENDL
  #define CERR_A( I , N , A ) 
  #define TLE( CONDITION ) if( !( CONDITION ) ){ ll TLE_VAR = 1; while( TLE_VAR != 0 ){ ( TLE_VAR += 2 ) %= int( 1e9 ); } cerr << TLE_VAR << endl; }
  #define MLE( CONDITION ) if( !( CONDITION ) ){ vector<vector<ll>> MLE_VAR{}; REPEAT( 1e6 ){ MLE_VAR.push_back( vector<ll>( 1e6 ) ); } cerr << MLE_VAR << endl; }
  #define OLE( CONDITION ) if( !( CONDITION ) ){ REPEAT( 1e8 ){ cerr << "OLE\n"; } }
#endif
#ifdef REACTIVE
  #ifndef DEBUG
    #define LOCAL( ... ) 
    #define RSET( A , ... ) SET( A )
  #endif
  #define RCIN( LL , A , ... ) LL A; RSET( A , __VA_ARGS__ )
  #define ENDL endl
#else
  #define ENDL "\n"
#endif
#include <bits/stdc++.h>
using namespace std;
#define ATT __attribute__( ( target( "sse4.2,fma,avx2,popcnt,lzcnt,bmi2" ) ) )
#define START_MAIN int main(){ ios_base::sync_with_stdio( false ); cin.tie( nullptr )
#define START_WATCH chrono::system_clock::time_point watch = chrono::system_clock::now(); double loop_average_time = 0.0 , loop_start_time = loop_average_time , current_time = loop_start_time; int loop_count = current_time; assert( loop_count == 0 )
#define CURRENT_TIME ( current_time = static_cast<double>( chrono::duration_cast<chrono::microseconds>( chrono::system_clock::now() - watch ).count() / 1000.0 ) )
#define CHECK_WATCH( TL_MS ) ( CURRENT_TIME , loop_count == 0 ? loop_start_time = current_time : loop_average_time = ( current_time - loop_start_time ) / loop_count , ++loop_count , current_time < TL_MS - loop_average_time * 2 - 100.0 )
#define CEXPR( LL , BOUND , VALUE ) CE LL BOUND = VALUE
#define SET_A_ASSERT( I , N , A , MIN , MAX ) FOR( VARIABLE_FOR_SET_A , 0 , N ){ SET_ASSERT( A[VARIABLE_FOR_SET_A + I] , MIN , MAX ); }
#define SET_AA_ASSERT( I0 , N0 , I1 , N1 , A , MIN , MAX ) FOR( VARIABLE_FOR_SET_AA0 , 0 , N0 ){ FOR( VARIABLE_FOR_SET_AA1 , 0 , N1 ){ SET_ASSERT( A[VARIABLE_FOR_SET_AA0 + I0][VARIABLE_FOR_SET_AA1 + I1] , MIN , MAX ); } }
#define CIN_ASSERT( A , MIN , MAX ) decldecay_t( MAX ) A; SET_ASSERT( A , MIN , MAX )
#define CIN_A_ASSERT( I , N , A , MIN , MAX ) vector<decldecay_t( MAX )> A( N + I ); SET_A_ASSERT( I , N , A , MIN , MAX )
#define CIN_AA_ASSERT( I0 , N0 , I1 , N1 , A , MIN , MAX ) vector A( N0 + I0 , vector<decldecay_t( MAX )>( N1 + I1 ) ); SET_AA_ASSERT( I0 , N0 , I1 , N1 , A , MIN , MAX )
#define PR1( A1 , ... ) A1
#define PR2( A1 , A2 , ... ) A2
#define PR3( A1 , A2 , A3 , ... ) A3
#define FOR_( VAR , INITIAL , FINAL , UPPER , COMP , INCR ) for( decldecay_t( UPPER ) VAR = INITIAL ; VAR COMP FINAL ; VAR INCR )
#define FOR( VAR , INITIAL , ... ) FOR_( VAR , INITIAL , PR1( __VA_ARGS__ ) , PR1( __VA_ARGS__ ) , < , PR3( __VA_ARGS__ , += PR2( __VA_ARGS__ , ? ) , ++ ) )
#define FOREQ( VAR , INITIAL , ... ) FOR_( VAR , INITIAL , PR1( __VA_ARGS__ ) , PR1( __VA_ARGS__ ) , <= , PR3( __VA_ARGS__ , += PR2( __VA_ARGS__ , ? ) , ++ ) )
#define FOREQINV( VAR , INITIAL , ... ) FOR_( VAR , INITIAL , PR1( __VA_ARGS__ ) , INITIAL , + 1 > , PR3( __VA_ARGS__ , -= PR2( __VA_ARGS__ , ? ) , -- ) )
#define ITR( ARRAY ) auto begin_ ## ARRAY = ARRAY .BE() , itr_ ## ARRAY = begin_ ## ARRAY , end_ ## ARRAY = ARRAY .EN()
#define FOR_ITR( ARRAY ) for( ITR( ARRAY ) , itr = itr_ ## ARRAY ; itr_ ## ARRAY != end_ ## ARRAY ; itr_ ## ARRAY ++ , itr++ )
#define RUN( ARRAY , ... ) for( auto&& __VA_ARGS__ : ARRAY )
#define REPEAT( HOW_MANY_TIMES ) FOR( VARIABLE_FOR_REPEAT , 0 , HOW_MANY_TIMES )
#define SET_PRECISION( DECIMAL_DIGITS ) cout << fixed << setprecision( DECIMAL_DIGITS ); cerr << fixed << setprecision( DECIMAL_DIGITS )
#define RETURN( ... ) SOLVE_ONLY; COUT( __VA_ARGS__ ); RE
#define COMPARE( ... ) auto naive = Naive( __VA_ARGS__ , false ); auto answer = Answer( __VA_ARGS__ , false ); bool match = naive == answer; CERR( "(" , #__VA_ARGS__ , ") == (" , __VA_ARGS__ , ") : Naive ==" , naive , match ? "==" : "!=" , answer , "== Answer" ); if( !match ){ CERR( "出力の不一致が検出されました。" ); RE; }
#define CHECK( ... ) auto answer = Answer( __VA_ARGS__ , false ); CERR( "(" , #__VA_ARGS__ , ") == (" , __VA_ARGS__ , ") : Answer == " , answer )

/* 圧縮用 */
#define TE template
#define TY typename
#define US using
#define ST static
#define AS assert
#define IN inline
#define CL class
#define PU public
#define OP operator
#define CE constexpr
#define CO const
#define NE noexcept
#define RE return 
#define WH while
#define VO void
#define VE vector
#define LI list
#define BE begin
#define EN end
#define SZ size
#define LE length
#define PW Power
#define MO move
#define TH this
#define CRI CO int&
#define CRUI CO uint&
#define CRL CO ll&
#define VI virtual 
#define IS basic_istream<char,Traits>
#define OS basic_ostream<char,Traits>
#define ST_AS static_assert
#define reMO_CO remove_const
#define is_COructible_v is_constructible_v
#define rBE rbegin

/* 型のエイリアス */
#define decldecay_t(VAR)decay_t<decltype(VAR)>
TE <TY F,TY...Args> US ret_t = decltype(declval<F>()(declval<Args>()...));
TE <TY T> US inner_t = TY T::type;
US uint = unsigned int;
US ll = long long;
US ull = unsigned long long;
US ld = long double;
US lld = __float128;

/* VVV 常設ライブラリは以下に挿入する。*/
#ifdef DEBUG
  #include "C:/Users/user/Documents/Programming/Contest/Template/Local/a_Body.hpp"
#else
/* Random (1KB)*/
ll GetRand(CRL Rand_min,CRL Rand_max){AS(Rand_min <= Rand_max);ll AN = time(NULL);RE AN * rand()%(Rand_max + 1 - Rand_min)+ Rand_min;}

/* Set (2KB)*/
#define DC_OF_HASH(...)struct hash<__VA_ARGS__>{IN size_t OP()(CO __VA_ARGS__& n)CO;};
CL is_ordered{PU:is_ordered()= delete;TE <TY T> ST CE auto Check(CO T& t)-> decltype(t < t,true_type());ST CE false_type Check(...);TE <TY T> ST CE CO bool value = is_same_v< decltype(Check(declval<T>())),true_type >;};
TE <TY T>US Set = conditional_t<is_COructible_v<unordered_set<T>>,unordered_set<T>,conditional_t<is_ordered::value<T>,set<T>,VO>>;

#define DF_OF_POP_FOR_SET(SET)TE <TY T> IN T pop_max(SET& S){AS(!S.empty());auto IT = --S.EN();T AN = *IT;S.erase(IT);RE AN;}TE <TY T> IN T pop_min(SET& S){AS(!S.empty());auto IT = S.BE();T AN = *IT;S.erase(IT);RE AN;}TE <TY T> IN SET& OP<<=(SET& S,T t){S.insert(MO(t));RE S;}TE <TY T,TY U> IN SET& OP<<=(SET& S,U&& u){S.insert(T{forward<U>(u)});RE S;}TE <TY T> IN SET& OP>>=(SET& S,CO T& t){S.erase(t);RE S;}TE <TY T,TY U> IN SET& OP>>=(SET& S,CO U& u){RE S >>= T{u};}TE <TY T> IN CO T& Get(CO SET& S,int i){auto BE = S.BE(),EN = S.EN();auto& IT = i < 0?(++i,--EN):BE;WH(i > 0 && IT != EN){--i;++IT;}WH(i < 0 && IT != BE){++i;--IT;}AS(i == 0);RE *IT;}
#define DF_OF_UNION_FOR_SET(SET)TE <TY T> IN SET& OP|=(SET& S0,SET S1){S0.merge(MO(S1));RE S0;}TE <TY T> IN SET OP|(SET S0,SET S1){RE MO(S0.SZ()< S1.SZ()?S1 |= MO(S0):S0 |= MO(S1));}
TE <TY SET,TY T> IN TY SET::const_iterator MaximumLeq(CO SET& S,CO T& t){auto IT = S.upper_bound(t);RE IT == S.BE()?S.EN():--IT;}TE <TY SET,TY T> IN TY SET::const_iterator MaximumLt(CO SET& S,CO T& t){auto IT = S.lower_bound(t);RE IT == S.BE()?S.EN():--IT;}TE <TY SET,TY T> IN TY SET::const_iterator MinimumGeq(CO SET& S,CO T& t){RE S.lower_bound(t);}TE <TY SET,TY T> IN TY SET::const_iterator MinimumGt(CO SET& S,CO T& t){RE S.upper_bound(t);}TE <TY SET,TY ITERATOR> IN VO EraseBack(SET& S,ITERATOR& IT){IT = S.erase(IT);}TE <TY SET,TY ITERATOR> IN VO EraseFront(SET& S,ITERATOR& IT){IT = S.erase(IT);IT == S.BE()?IT = S.EN():--IT;}TE <TE <TY...> TY SET,TY T,TY...Args> IN bool In(CO T& t,CO SET<T,Args...>& S){RE S.count(t)== 1;}DF_OF_POP_FOR_SET(set<T>);DF_OF_POP_FOR_SET(unordered_set<T>);DF_OF_POP_FOR_SET(multiset<T>);DF_OF_POP_FOR_SET(unordered_multiset<T>);DF_OF_UNION_FOR_SET(set<T>);DF_OF_UNION_FOR_SET(unordered_set<T>);DF_OF_UNION_FOR_SET(multiset<T>);DF_OF_UNION_FOR_SET(unordered_multiset<T>);DF_OF_UNION_FOR_SET(VE<T>);DF_OF_UNION_FOR_SET(LI<T>);

/* Tuple (6KB)*/
#define DF_OF_AR_FOR_TUPLE(OPR)TE <TY T,TY U,TE <TY...> TY PAIR> IN auto OP OPR ## =(PAIR<T,U>& t0,CO PAIR<T,U>& t1)-> decltype((get<0>(t0),t0))&{get<0>(t0)OPR ## = get<0>(t1);get<1>(t0)OPR ## = get<1>(t1);RE t0;}TE <TY T,TY U,TY V,TE <TY...> TY TUPLE> IN auto OP OPR ## =(TUPLE<T,U,V>& t0,CO TUPLE<T,U,V>& t1)-> decltype((get<0>(t0),t0))&{get<0>(t0)OPR ## = get<0>(t1);get<1>(t0)OPR ## = get<1>(t1);get<2>(t0)OPR ## = get<2>(t1);RE t0;}TE <TY T,TY U,TY V,TY W,TE <TY...> TY TUPLE> IN auto OP OPR ## =(TUPLE<T,U,V,W>& t0,CO TUPLE<T,U,V,W>& t1)-> decltype((get<0>(t0),t0))&{get<0>(t0)OPR ## = get<0>(t1);get<1>(t0)OPR ## = get<1>(t1);get<2>(t0)OPR ## = get<2>(t1);get<3>(t0)OPR ## = get<3>(t1);RE t0;}TE <TY ARG,TY T,TY U,TE <TY...> TY PAIR> IN auto OP OPR ## =(PAIR<T,U>& t0,CO ARG& t1)-> decltype((get<0>(t0),t0))&{get<0>(t0)OPR ## = t1;get<1>(t0)OPR ## = t1;RE t0;}TE <TY ARG,TY T,TY U,TY V,TE <TY...> TY TUPLE> IN auto OP OPR ## =(TUPLE<T,U,V>& t0,CO ARG& t1)-> decltype((get<0>(t0),t0))&{get<0>(t0)OPR ## = t1;get<1>(t0)OPR ## = t1;get<2>(t0)OPR ## = t1;RE t0;}TE <TY ARG,TY T,TY U,TY V,TY W,TE <TY...> TY TUPLE> IN auto OP OPR ## =(TUPLE<T,U,V,W>& t0,CO ARG& t1)-> decltype((get<0>(t0),t0))&{get<0>(t0)OPR ## = t1;get<1>(t0)OPR ## = t1;get<2>(t0)OPR ## = t1;get<3>(t0)OPR ## = t1;RE t0;}TE <TE <TY...> TY TUPLE,TY...ARGS,TY ARG> IN auto OP OPR(CO TUPLE<ARGS...>& t0,CO ARG& t1)-> decldecay_t((get<0>(t0),t0)){auto t = t0;RE MO(t OPR ## = t1);}
#define DF_OF_INCREMENT_FOR_TUPLE(INCR)TE <TY T,TY U,TE <TY...> TY PAIR> IN auto OP INCR(PAIR<T,U>& t)-> decltype((get<0>(t),t))&{INCR get<0>(t);INCR get<1>(t);RE t;}TE <TY T,TY U,TY V,TE <TY...> TY TUPLE> IN auto OP INCR(TUPLE<T,U,V>& t)-> decltype((get<0>(t),t))&{INCR get<0>(t);INCR get<1>(t);INCR get<2>(t);RE t;}TE <TY T,TY U,TY V,TY W,TE <TY...> TY TUPLE> IN auto OP INCR(TUPLE<T,U,V,W>& t)-> decltype((get<0>(t),t))&{INCR get<0>(t);INCR get<1>(t);INCR get<2>(t);INCR get<3>(t);RE t;}
TE <CL Traits,TY T> IN IS& OP>>(IS& is,tuple<T>& arg){RE is >> get<0>(arg);}TE <CL Traits,TY T,TY U,TE <TY...> TY V> IN auto OP>>(IS& is,V<T,U>& arg)-> decltype((get<0>(arg),is))&{RE is >> get<0>(arg)>> get<1>(arg);}TE <CL Traits,TY T,TY U,TY V> IN IS& OP>>(IS& is,tuple<T,U,V>& arg){RE is >> get<0>(arg)>> get<1>(arg)>> get<2>(arg);}TE <CL Traits,TY T,TY U,TY V,TY W> IN IS& OP>>(IS& is,tuple<T,U,V,W>& arg){RE is >> get<0>(arg)>> get<1>(arg)>> get<2>(arg)>> get<3>(arg);}TE <CL Traits,TY T> IN OS& OP<<(OS& os,CO tuple<T>& arg){RE os << get<0>(arg);}TE <CL Traits,TY T,TY U,TE <TY...> TY V> IN auto OP<<(OS& os,CO V<T,U>& arg)-> decltype((get<0>(arg),os))&{RE os << get<0>(arg)<< " " << get<1>(arg);}TE <CL Traits,TY T,TY U,TY V> IN OS& OP<<(OS& os,CO tuple<T,U,V>& arg){RE os << get<0>(arg)<< " " << get<1>(arg)<< " " << get<2>(arg);}TE <CL Traits,TY T,TY U,TY V,TY W> IN OS& OP<<(OS& os,CO tuple<T,U,V,W>& arg){RE os << get<0>(arg)<< " " << get<1>(arg)<< " " << get<2>(arg)<< " " << get<3>(arg);}DF_OF_AR_FOR_TUPLE(+);TE <TY T,TY U,TE <TY...> TY V> IN auto OP-(CO V<T,U>& t)-> decldecay_t((get<0>(t),t)){RE{-get<0>(t),-get<1>(t)};}TE <TY T,TY U,TY V> IN tuple<T,U,V> OP-(CO tuple<T,U,V>& t){RE{-get<0>(t),-get<1>(t),-get<2>(t)};}TE <TY T,TY U,TY V,TY W> IN tuple<T,U,V,W> OP-(CO tuple<T,U,V,W>& t){RE{-get<0>(t),-get<1>(t),-get<2>(t),-get<3>(t)};}DF_OF_AR_FOR_TUPLE(-);DF_OF_AR_FOR_TUPLE(*);DF_OF_AR_FOR_TUPLE(/);DF_OF_AR_FOR_TUPLE(%);DF_OF_INCREMENT_FOR_TUPLE(++);DF_OF_INCREMENT_FOR_TUPLE(--);

TE <int n>CL TupleAccessIndex{};TE <TY...Types>CL Tuple:PU tuple<Types...>{PU:IN Tuple(Types&&... args);TE <TY...Args> IN Tuple(Args&&... args);TE <int n> IN auto& OP[](CO TupleAccessIndex<n>& i)NE;TE <int n> IN CO auto& OP[](CO TupleAccessIndex<n>& i)CO NE;};TE <TY...Types>CL tuple_size<Tuple<Types...>>:PU tuple_size<tuple<Types...>>{};TE <size_t n,TY...Types>CL tuple_element<n,Tuple<Types...>>:PU tuple_element<n,tuple<Types...>>{};
TE <TY T,TY U> US Pair = Tuple<T,U>;TE <TY INT> US T2 = Pair<INT,INT>;TE <TY INT> US T3 = Tuple<INT,INT,INT>;TE <TY INT> US T4 = Tuple<INT,INT,INT,INT>;
CE TupleAccessIndex<0> O{};CE TupleAccessIndex<1> I{};CE TupleAccessIndex<2> II{};CE TupleAccessIndex<3> III{};
TE <TY...Types> IN Tuple<Types...>::Tuple(Types&&... args):tuple<Types...>(MO(args)...){}TE <TY...Types> TE <TY...Args> IN Tuple<Types...>::Tuple(Args&&... args):tuple<Types...>(forward<Args>(args)...){}TE <TY...Types> TE <int n> IN auto& Tuple<Types...>::OP[](CO TupleAccessIndex<n>& i)NE{RE get<n>(*TH);}TE <TY...Types> TE <int n> IN CO auto& Tuple<Types...>::OP[](CO TupleAccessIndex<n>& i)CO NE{RE get<n>(*TH);}

#define DF_OF_HASH_FOR_TUPLE(PAIR)TE <TY T,TY U> IN size_t hash<PAIR<T,U>>::OP()(CO PAIR<T,U>& n)CO{ST CO size_t seed =(GetRand(1e3,1e8)<< 1)| 1;ST CO hash<T> h0;ST CO hash<U> h1;RE(h0(get<0>(n))* seed)^ h1(get<1>(n));}
TE <TY T> DC_OF_HASH(tuple<T>);TE <TY T,TY U> DC_OF_HASH(pair<T,U>);TE <TY T,TY U> DC_OF_HASH(tuple<T,U>);TE <TY T,TY U,TY V> DC_OF_HASH(tuple<T,U,V>);TE <TY T,TY U,TY V,TY W> DC_OF_HASH(tuple<T,U,V,W>);
TE <TY T> IN size_t hash<tuple<T>>::OP()(CO tuple<T>& n)CO{ST CO hash<T> h;RE h(get<0>(n));}DF_OF_HASH_FOR_TUPLE(pair);DF_OF_HASH_FOR_TUPLE(tuple);TE <TY T,TY U,TY V> IN size_t hash<tuple<T,U,V>>::OP()(CO tuple<T,U,V>& n)CO{ST CO size_t seed =(GetRand(1e3,1e8)<< 1)| 1;ST CO hash<pair<T,U>> h01;ST CO hash<V> h2;RE(h01({get<0>(n),get<1>(n)})* seed)^ h2(get<2>(n));}TE <TY T,TY U,TY V,TY W> IN size_t hash<tuple<T,U,V,W>>::OP()(CO tuple<T,U,V,W>& n)CO{ST CO size_t seed =(GetRand(1e3,1e8)<< 1)| 1;ST CO hash<pair<T,U>> h01;ST CO hash<pair<V,W>> h23;RE(h01({get<0>(n),get<1>(n)})* seed)^ h23({get<2>(n),get<3>(n)});}

/* Vector (3KB)*/
#define DF_OF_COUT_FOR_VE(V)TE <CL Traits,TY Arg> IN OS& OP<<(OS& os,CO V<Arg>& arg){auto BE = arg.BE(),EN = arg.EN();auto IT = BE;WH(IT != EN){(IT == BE?os:os << " ")<< *IT;IT++;}RE os;}
DF_OF_COUT_FOR_VE(VE);DF_OF_COUT_FOR_VE(LI);DF_OF_COUT_FOR_VE(set);DF_OF_COUT_FOR_VE(unordered_set);DF_OF_COUT_FOR_VE(multiset);IN VO VariadicResize(CRI SZ){}TE <TY Arg,TY... ARGS> IN VO VariadicResize(CRI SZ,Arg& arg,ARGS&... args){arg.resize(SZ);VariadicResize(SZ,args...);}

#define DF_OF_AR_FOR_VE(V,OPR)TE <TY T> IN V<T>& OP OPR ## =(V<T>& a0,CO V<T>& a1){AS(a0.SZ()<= a1.SZ());auto IT0 = a0.BE(),EN0 = a0.EN();auto IT1 = a1.BE();WH(IT0 != EN0){*(IT0++)OPR ## = *(IT1++);}RE a0;}TE <TY T> IN V<T>& OP OPR ## =(V<T>& a,CO T& t){for(auto& x:a){x OPR## = t;}RE a;}TE <TY T,TY U> IN V<T> OP OPR(V<T> a,CO U& u){RE MO(a OPR ## = u);}
#define DF_OF_INCREMENT_FOR_VE(V,INCR)TE <TY T> IN V<T>& OP INCR(V<T>& a){for(auto& i:a){INCR i;}RE a;}
#define DF_OF_SHIFT_FOR_VE(V)TE <TY T> IN V<T>& OP<<=(V<T>& a,T t){a.push_back(MO(t));RE a;}TE <TY T,TY U> IN V<T>& OP<<=(V<T>& a,U&& u){RE a <<= T{forward<U>(u)};}TE <TY T> IN T pop(V<T>& a){AS(!a.empty());T AN = MO(a.back());a.pop_back();RE AN;}
#define DF_OF_ARS_FOR_VE(V)DF_OF_AR_FOR_VE(V,+);DF_OF_AR_FOR_VE(V,-);DF_OF_AR_FOR_VE(V,*);DF_OF_AR_FOR_VE(V,/);DF_OF_AR_FOR_VE(V,%);DF_OF_INCREMENT_FOR_VE(V,++);DF_OF_INCREMENT_FOR_VE(V,--);TE <TY T> IN V<T> OP-(V<T> a){RE MO(a *= T(-1));}TE <TY T> IN V<T> OP*(CO T& t,V<T> v){RE MO(v *= t);}DF_OF_SHIFT_FOR_VE(V);
DF_OF_ARS_FOR_VE(VE);DF_OF_ARS_FOR_VE(LI);DF_OF_SHIFT_FOR_VE(basic_string);
TE <TY V> IN auto Get(V& a){RE[&](CRI i = 0)-> CO decldecay_t(a[0])&{RE a[i];};}TE <TY T> IN VE<T> id(CRI SZ){VE<T> AN(SZ);for(int i = 0;i < SZ;i++){AN[i]= i;}RE AN;}TE <TY V> IN VO Sort(V& a,CO bool& reversed = false){US T = decltype(a[0]);if(reversed){ST auto comp =[](CO T& t0,CO T& t1){RE t1 < t0;};sort(a.BE(),a.EN(),comp);}else{sort(a.BE(),a.EN());}}TE <TY V0,TY V1> IN VO Sort(V0& a,V1& b,CO bool& reversed = false){CO int SZ = a.SZ();AS(SZ == int(b.SZ()));VE<pair<decltype(a[0]),decltype(b[0])>> v(SZ);for(int i = 0;i < SZ;i++){v[i]={MO(a[i]),MO(b[i])};}Sort(v,reversed);for(int i = 0;i < SZ;i++){a[i]= MO(v[i].first);b[i]= MO(v[i].second);}}TE <TY V> IN pair<VE<int>,VE<int>> IndexSort(CO V& a,CO bool& reversed = false){CO int SZ = a.SZ();auto index = id<int>(SZ),ord = index;sort(index.BE(),index.EN(),[&](CRI i,CRI j){CO pair ti{a[i],i},tj{a[j],j};RE reversed?tj < ti:ti < tj;});for(int i = 0;i < SZ;i++){ord[index[i]]= i;}RE{MO(index),MO(ord)};}TE <TY V> IN int len(CO V& a){RE a.SZ();}TE <TY V> IN VO Reverse(V& a){CO int SZ = len(a),half = SZ / 2;for(int i = 0;i < half;i++){swap(a[i],a[SZ-1-i]);}};TE <TY V> IN V Reversed(V a){Reverse(a);RE MO(a);}

/* Map (1KB)*/
#define DF_OF_AR_FOR_MAP(MAP,OPR)TE <TY T,TY U> IN MAP<T,U>& OP OPR ## =(MAP<T,U>& a,CO pair<T,U>& v){a[v.first]OPR ## = v.second;RE a;}TE <TY T,TY U> IN MAP<T,U>& OP OPR ## =(MAP<T,U>& a0,CO MAP<T,U>& a1){for(auto&[t,u]:a1){a0[t]OPR ## = u;}RE a0;}TE <TY T,TY U,TY ARG> IN MAP<T,U> OP OPR(MAP<T,U> a,CO ARG& arg){RE MO(a OPR ## = arg);}
#define DF_OF_ARS_FOR_MAP(MAP)DF_OF_AR_FOR_MAP(MAP,+);DF_OF_AR_FOR_MAP(MAP,-);DF_OF_AR_FOR_MAP(MAP,*);DF_OF_AR_FOR_MAP(MAP,/);DF_OF_AR_FOR_MAP(MAP,%);
TE <TY T,TY U>US Map = conditional_t<is_COructible_v<unordered_map<T,int>>,unordered_map<T,U>,conditional_t<is_ordered::value<T>,map<T,U>,VO>>;
DF_OF_ARS_FOR_MAP(map);DF_OF_ARS_FOR_MAP(unordered_map);

/* StdStream (2KB)*/
TE <CL Traits> IN IS& VariadicCin(IS& is){RE is;}TE <CL Traits,TY Arg,TY... ARGS> IN IS& VariadicCin(IS& is,Arg& arg,ARGS&... args){RE VariadicCin(is >> arg,args...);}TE <CL Traits> IN IS& VariadicSet(IS& is,CRI i){RE is;}TE <CL Traits,TY Arg,TY... ARGS> IN IS& VariadicSet(IS& is,CRI i,Arg& arg,ARGS&... args){RE VariadicSet(is >> arg[i],i,args...);}TE <CL Traits> IN IS& VariadicGetline(IS& is,CO char& separator){RE is;}TE <CL Traits,TY Arg,TY... ARGS> IN IS& VariadicGetline(IS& is,CO char& separator,Arg& arg,ARGS&... args){RE VariadicGetline(getline(is,arg,separator),separator,args...);}TE <CL Traits,TY Arg> IN OS& VariadicCout(OS& os,Arg&& arg){RE os << forward<Arg>(arg);}TE <CL Traits,TY Arg1,TY Arg2,TY... ARGS> IN OS& VariadicCout(OS& os,Arg1&& arg1,Arg2&& arg2,ARGS&&... args){RE VariadicCout(os << forward<Arg1>(arg1)<< " ",forward<Arg2>(arg2),forward<ARGS>(args)...);}TE <CL Traits,TY Arg> IN OS& VariadicCoutNonSep(OS& os,Arg&& arg){RE os << forward<Arg>(arg);}TE <CL Traits,TY Arg1,TY Arg2,TY... ARGS> IN OS& VariadicCoutNonSep(OS& os,Arg1&& arg1,Arg2&& arg2,ARGS&&... args){RE VariadicCoutNonSep(os << forward<Arg1>(arg1),forward<Arg2>(arg2),forward<ARGS>(args)...);}TE <CL Traits,TY ARRAY> IN OS& CoutArray(OS& os,CRI i_start,CRI i_ulim,ARRAY&& a){for(int i = i_start;i < i_ulim;i++){(i == i_start?os:(os << " "))<< a[i];}RE os;}

/* Module (6KB)*/
#define DC_OF_CPOINT(POINT)IN CO U& POINT()CO NE
#define DC_OF_POINT(POINT)IN U& POINT()NE
#define DF_OF_CPOINT(POINT)TE <TY U> IN CO U& VirtualPointedSet<U>::POINT()CO NE{RE Point();}
#define DF_OF_POINT(POINT)TE <TY U> IN U& VirtualPointedSet<U>::POINT()NE{RE Point();}
TE <TY U>CL UnderlyingSet{PU:US type = U;};TE <TY U>CL VirtualPointedSet:VI PU UnderlyingSet<U>{PU:VI CO U& Point()CO NE = 0;VI U& Point()NE = 0;DC_OF_CPOINT(Unit);DC_OF_CPOINT(Zero);DC_OF_CPOINT(One);DC_OF_CPOINT(Infty);DC_OF_POINT(init);DC_OF_POINT(root);};TE <TY U>CL PointedSet:VI PU VirtualPointedSet<U>{PU:U m_b_U;IN PointedSet(U b_u = U());IN CO U& Point()CO NE;IN U& Point()NE;};TE <TY U>CL VirtualNSet:VI PU UnderlyingSet<U>{PU:VI U Transfer(CO U& u)= 0;IN U Inverse(CO U& u);};TE <TY U,TY F_U>CL AbstractNSet:VI PU VirtualNSet<U>{PU:F_U m_f_U;IN AbstractNSet(F_U f_U);IN AbstractNSet<U,F_U>& OP=(CO AbstractNSet&)NE;IN U Transfer(CO U& u);};TE <TY U>CL VirtualMagma:VI PU UnderlyingSet<U>{PU:VI U Product(U u0,CO U& u1)= 0;IN U Sum(U u0,CO U& u1);};TE <TY U = ll>CL AdditiveMagma:VI PU VirtualMagma<U>{PU:IN U Product(U u0,CO U& u1);};TE <TY U = ll>CL MultiplicativeMagma:VI PU VirtualMagma<U>{PU:IN U Product(U u0,CO U& u1);};TE <TY U,TY M_U>CL AbstractMagma:VI PU VirtualMagma<U>{PU:M_U m_m_U;IN AbstractMagma(M_U m_U);IN AbstractMagma<U,M_U>& OP=(CO AbstractMagma<U,M_U>&)NE;IN U Product(U u0,CO U& u1);};
TE <TY U> IN PointedSet<U>::PointedSet(U b_U):m_b_U(MO(b_U)){}TE <TY U> IN CO U& PointedSet<U>::Point()CO NE{RE m_b_U;}TE <TY U> IN U& PointedSet<U>::Point()NE{RE m_b_U;}DF_OF_CPOINT(Unit);DF_OF_CPOINT(Zero);DF_OF_CPOINT(One);DF_OF_CPOINT(Infty);DF_OF_POINT(init);DF_OF_POINT(root);TE <TY U,TY F_U> IN AbstractNSet<U,F_U>::AbstractNSet(F_U f_U):m_f_U(MO(f_U)){ST_AS(is_invocable_r_v<U,F_U,U>);}TE <TY U,TY F_U> IN AbstractNSet<U,F_U>& AbstractNSet<U,F_U>::operator=(CO AbstractNSet<U,F_U>&)NE{RE *TH;}TE <TY U,TY F_U> IN U AbstractNSet<U,F_U>::Transfer(CO U& u){RE m_f_U(u);}TE <TY U> IN U VirtualNSet<U>::Inverse(CO U& u){RE Transfer(u);}TE <TY U,TY M_U> IN AbstractMagma<U,M_U>::AbstractMagma(M_U m_U):m_m_U(MO(m_U)){ST_AS(is_invocable_r_v<U,M_U,U,U>);}TE <TY U,TY M_U> IN AbstractMagma<U,M_U>& AbstractMagma<U,M_U>::OP=(CO AbstractMagma<U,M_U>&)NE{RE *TH;}TE <TY U> IN U AdditiveMagma<U>::Product(U u0,CO U& u1){RE MO(u0 += u1);}TE <TY U> IN U MultiplicativeMagma<U>::Product(U u0,CO U& u1){RE MO(u0 *= u1);}TE <TY U,TY M_U> IN U AbstractMagma<U,M_U>::Product(U u0,CO U& u1){RE m_m_U(MO(u0),u1);}TE <TY U> IN U VirtualMagma<U>::Sum(U u0,CO U& u1){RE Product(MO(u0),u1);}

TE <TY U>CL VirtualMonoid:VI PU VirtualMagma<U>,VI PU VirtualPointedSet<U>{};TE <TY U = ll>CL AdditiveMonoid:VI PU VirtualMonoid<U>,PU AdditiveMagma<U>,PU PointedSet<U>{};TE <TY U = ll>CL MultiplicativeMonoid:VI PU VirtualMonoid<U>,PU MultiplicativeMagma<U>,PU PointedSet<U>{PU:IN MultiplicativeMonoid(U e_U);};TE <TY U,TY M_U>CL AbstractMonoid:VI PU VirtualMonoid<U>,PU AbstractMagma<U,M_U>,PU PointedSet<U>{PU:IN AbstractMonoid(M_U m_U,U e_U);};
TE <TY U> IN MultiplicativeMonoid<U>::MultiplicativeMonoid(U e_U):PointedSet<U>(MO(e_U)){}TE <TY U,TY M_U> IN AbstractMonoid<U,M_U>::AbstractMonoid(M_U m_U,U e_U):AbstractMagma<U,M_U>(MO(m_U)),PointedSet<U>(MO(e_U)){}

TE <TY U>CL VirtualGroup:VI PU VirtualMonoid<U>,VI PU VirtualPointedSet<U>,VI PU VirtualNSet<U>{};TE <TY U = ll>CL AdditiveGroup:VI PU VirtualGroup<U>,PU AdditiveMonoid<U>{PU:IN U Transfer(CO U& u);};TE <TY U,TY M_U,TY I_U>CL AbstractGroup:VI PU VirtualGroup<U>,PU AbstractMonoid<U,M_U>,PU AbstractNSet<U,I_U>{PU:IN AbstractGroup(M_U m_U,U e_U,I_U i_U);};
TE <TY U,TY M_U,TY I_U> IN AbstractGroup<U,M_U,I_U>::AbstractGroup(M_U m_U,U e_U,I_U i_U):AbstractMonoid<U,M_U>(MO(m_U),MO(e_U)),AbstractNSet<U,I_U>(MO(i_U)){}TE <TY U> IN U AdditiveGroup<U>::Transfer(CO U& u){RE -u;}

TE <TY R,TY U>CL VirtualRSet:VI PU UnderlyingSet<U>{PU:VI U Action(CO R& r,U u)= 0;IN U PW(U u,CO R& r);IN U ScalarProduct(CO R& r,U u);};TE <TY U,TY MAGMA>CL RegularRSet:VI PU VirtualRSet<U,U>,PU MAGMA{PU:IN RegularRSet(MAGMA magma);IN U Action(CO U& r,U u);};TE <TY MAGMA> RegularRSet(MAGMA magma)-> RegularRSet<inner_t<MAGMA>,MAGMA>;TE <TY R,TY U,TY O_U>CL AbstractRSet:VI PU VirtualRSet<R,U>{PU:O_U m_o_U;IN AbstractRSet(CO R& dummy0,CO U& dummy1,O_U o_U);IN AbstractRSet<R,U,O_U>& OP=(CO AbstractRSet<R,U,O_U>&)NE;IN U Action(CO R& r,U u);};TE <TY R,TY U,TY O_U,TY GROUP>CL AbstractModule:PU AbstractRSet<R,U,O_U>,PU GROUP{PU:IN AbstractModule(CO R& dummy,O_U o_U,GROUP M);};TE <TY R,TY O_U,TY GROUP> AbstractModule(CO R& dummy,O_U o_U,GROUP M)-> AbstractModule<R,inner_t<GROUP>,O_U,GROUP>;TE <TY R,TY U>CL Module:VI PU VirtualRSet<R,U>,PU AdditiveGroup<U>{PU:IN U Action(CO R& r,U u);};
TE <TY R,TY MAGMA> IN RegularRSet<R,MAGMA>::RegularRSet(MAGMA magma):MAGMA(MO(magma)){}TE <TY R,TY U,TY O_U> IN AbstractRSet<R,U,O_U>::AbstractRSet(CO R& dummy0,CO U& dummy1,O_U o_U):m_o_U(MO(o_U)){ST_AS(is_invocable_r_v<U,O_U,R,U>);}TE <TY R,TY U,TY O_U,TY GROUP> IN AbstractModule<R,U,O_U,GROUP>::AbstractModule(CO R& dummy,O_U o_U,GROUP M):AbstractRSet<R,U,O_U>(dummy,M.One(),MO(o_U)),GROUP(MO(M)){ST_AS(is_same_v<U,inner_t<GROUP>>);}TE <TY R,TY U,TY O_U> IN AbstractRSet<R,U,O_U>& AbstractRSet<R,U,O_U>::OP=(CO AbstractRSet<R,U,O_U>&)NE{RE *TH;}TE <TY U,TY MAGMA> IN U RegularRSet<U,MAGMA>::Action(CO U& r,U u){RE TH->Product(r,MO(u));}TE <TY R,TY U,TY O_U> IN U AbstractRSet<R,U,O_U>::Action(CO R& r,U u){RE m_o_U(r,MO(u));}TE <TY R,TY U> IN U Module<R,U>::Action(CO R& r,U u){RE MO(u *= r);}TE <TY R,TY U> IN U VirtualRSet<R,U>::PW(U u,CO R& r){RE Action(r,MO(u));}TE <TY R,TY U> IN U VirtualRSet<R,U>::ScalarProduct(CO R& r,U u){RE Action(r,MO(u));}

/* Loop (1KB)*/
TE <TY INT> bool NextLoop(CRI SZ,CO VE<INT>& lower_bound,CO VE<INT>& upper_limit,VE<INT>& index){int depth = 0;WH(depth < SZ){if(++index[depth]< upper_limit[depth]){break;}index[depth]= lower_bound[depth];depth++;}RE depth < SZ;}TE <TY INT> bool NextLoop(CO VE<INT>& lower_bound,CO VE<INT>& upper_limit,VE<INT>& index){RE NextLoop(index.SZ(),lower_bound,upper_limit,index);}TE <TY INT> bool NextLoopEq(CRI SZ,CO VE<INT>& lower_bound,CO VE<INT>& upper_bound,VE<INT>& index){int depth = 0;WH(depth < SZ){if(++index[depth]<= upper_bound[depth]){break;}index[depth]= lower_bound[depth];depth++;}RE depth < SZ;}TE <TY INT> bool NextLoopEq(CO VE<INT>& lower_bound,CO VE<INT>& upper_bound,VE<INT>& index){RE NextLoopEq(index.SZ(),lower_bound,upper_bound,index);}

/* string (1KB)*/
TE <TY INT> IN char IntToChar(CO INT& i,CO char& c = 'a'){RE c + i;}TE <TY INT = int> IN INT CharToInt(CO char& i){RE i -(i < 'a'?'A':'a');}TE <TY INT>string ArrayToString(CO VE<INT>& A,CO char& c = 'a'){CO int N = A.SZ();string S(N,c);for(int i = 0;i < N;i++){S[i]= IntToChar<INT>(A[i],c);}RE S;}TE <TY INT = int>VE<INT> StringToArray(CO string& S){CO int N = S.SZ();VE<int> A(N);for(int i = 0;i < N;i++){A[i]= CharToInt<INT>(S[i]);}RE A;}TE <TY INT>string ArrayToParenthesisString(CO VE<INT>& A){CO int N = A.SZ();string S(N,'(');for(int i = 0;i < N;i++){AS(0 <= A[i]&& A[i]<= 1);S[i]= "()"[A[i]];}RE S;}TE <TY INT = int>VE<INT> ParenthesisStringToArray(CO string& S){CO int N = S.SZ();VE<int> A(N);for(int i = 0;i < N;i++){A[i]= S[i]- '(';}RE A;}
#endif
/* AAA 常設ライブラリは以上に挿入する。*/

#define INCLUDE_LIBRARY
#include __FILE__
#endif /* INCLUDE_LIBRARY */
#endif /* INCLUDE_SUB */
#endif /* INCLUDE_MAIN */
0