#include namespace ProconLib{ // struct MUStructExample{ // struct Monoid{ // using value_t=int; // static const value_t E = 0; // static value_t op(value_t lhs,value_t rhs){ return lhs+rhs;} // }; // struct Update{ // using update_t = int; // static update_t op(update_t lhs,update_t rhs){ return lhs+rhs;} // }; // static Monoid::value_t evaluate(Monoid::value_t v,Update::update_t u,int l,int r){ return v+u*(r-l);} // }; template class LazySegmentTree{ public: using Monoid=typename MUStruct::Monoid; using Update=typename MUStruct::Update; using value_t=typename Monoid::value_t; using update_t=typename Update::update_t; private: int N; std::vector dat; std::vector lazy; std::vector flag; int calcN(int n){int res=1; while(res LazySegmentTree::LazySegmentTree(int n):N(calcN(n)),dat(N*2-1,Monoid::E()),lazy(N*2-1),flag(N*2-1,false){} template void LazySegmentTree::propagate(int node,int l,int r){ if(flag[node]){ flag[node]=false; applyLazy(node*2+1,lazy[node]); applyLazy(node*2+2,lazy[node]); int mid=(l+r)/2; dat[node]=Monoid::op(getValue(node*2+1,l,mid),getValue(node*2+2,mid,r)); } } template void LazySegmentTree::applyLazy(int node,update_t x){ if(flag[node]){ lazy[node]=Update::op(lazy[node],x); } else{ flag[node]=true; lazy[node]=x; } } template void LazySegmentTree::updateImpl(int l,int r,int k,int lb,int ub,update_t x){ if(r<=lb || ub<=l) return; if(l<=lb && ub<=r){ applyLazy(k,x); return; } propagate(k,lb,ub); int mid=(lb+ub)/2; updateImpl(l,r,k*2+1,lb,mid,x); updateImpl(l,r,k*2+2,mid,ub,x); dat[k]=Monoid::op(getValue(k*2+1,lb,ub),getValue(k*2+2,lb,ub)); } template typename LazySegmentTree::value_t LazySegmentTree::queryImpl(int l,int r,int k,int lb,int ub){ if(r<=lb || ub<=l) return Monoid::E(); if(l<=lb && ub<=r){ return getValue(k,lb,ub); } propagate(k,lb,ub); int mid=(lb+ub)/2; value_t lhs=queryImpl(l,r,k*2+1,lb,mid); value_t rhs=queryImpl(l,r,k*2+2,mid,ub); return Monoid::op(lhs,rhs); } template void LazySegmentTree::update(int l,int r,update_t x){ updateImpl(l,r,0,0,N,x); } template typename LazySegmentTree::value_t LazySegmentTree::query(int l,int r){ return queryImpl(l,r,0,0,N); } }; //verify(yukicoder No,318)? using namespace std; using namespace ProconLib; struct MyMUStruct{ struct Monoid{ using value_t = int; static constexpr value_t E(){return 0;} static value_t op(value_t x,value_t y){ return max(x,y); } }; struct Update{ using update_t = int; static update_t op(update_t x,update_t y){ return y; } }; static typename Monoid::value_t evaluate(Monoid::value_t x,Update::update_t y,int l,int r){ return y; } }; int main(){ int n; cin>>n; vector a(n); for(int i=0;i>a[i]; map> mp; for(int i=0;i seg(n); for(auto &e:mp){ int tar=e.first; vector& vec=e.second; if(vec.empty()) continue; seg.update(vec[0],vec.back()+1,tar); } vector b(n); for(int i=0;i