#include namespace ProconLib{ template class LazySegmentTree{ public: using UpdateMerger=std::function; using ValueMerger=std::function; using Evaluator=std::function; private: int N; const value_t E; UpdateMerger mergeU; ValueMerger mergeV; Evaluator eval; std::vector dat; std::vector lazy; std::vector flag; void propagate(int node); void applyLazy(int node,update_t x); void updateImpl(int l,int r,int k,int lb,int ub,update_t f); value_t queryImpl(int l,int r,int k,int lb,int ub); value_t getValue(int node){return flag[node] ? eval(dat[node],lazy[node]) : dat[node];} public: LazySegmentTree(int N,Evaluator eval,UpdateMerger mergeU,ValueMerger mergeV,value_t E); void update(int l,int r,update_t f); void update(int pos,value_t x); value_t query(int a,int b); void debug(){ int p=1; int idx=0; std::cerr<<"#dat info"< LazySegmentTree::LazySegmentTree(int N,Evaluator eval,UpdateMerger mergeU,ValueMerger mergeV,value_t E):mergeU(mergeU),mergeV(mergeV),eval(eval),E(E){ this->N=1; while(this->NN*=2; dat.assign(this->N*2-1,E); lazy.assign(this->N*2-1,update_t()); flag.assign(this->N*2-1,false); } /* template LazySegmentTree:: */ template void LazySegmentTree::propagate(int node){ if(flag[node]){ flag[node]=false; applyLazy(node*2+1,lazy[node]); applyLazy(node*2+2,lazy[node]); dat[node]=mergeV(getValue(node*2+1),getValue(node*2+2)); } } template void LazySegmentTree::applyLazy(int node,update_t x){ if(flag[node]){ lazy[node]=mergeU(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); 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]=mergeV(getValue(k*2+1),getValue(k*2+2)); } template value_t LazySegmentTree::queryImpl(int l,int r,int k,int lb,int ub){ if(r<=lb || ub<=l) return E; if(l<=lb && ub<=r){ return getValue(k); } propagate(k); 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 mergeV(lhs,rhs); } template void LazySegmentTree::update(int l,int r,update_t x){ updateImpl(l,r,0,0,N,x); } template void LazySegmentTree::update(int pos,value_t x){ pos+=N-1; std::stack st; int p=pos; while(p>0){ int par=(p-1)/2; st.push(par); p=par; } while(!st.empty()){ int p=st.top(); st.pop(); propagate(p); } flag[pos]=false; dat[pos]=x; while(pos>0){ int par=(pos-1)/2; dat[par]=mergeV(getValue(par*2+1),getValue(par*2+2)); pos=par; } } template 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; int paste(int x,int y){ return y; } int mymax(int x,int y){ return max(x,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,paste,paste,mymax,0); 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