#include using namespace std; #define ALL(x) x.begin(),x.end() #define rep(i,n) for(int i=0;i<(n);i++) #define debug(v) cout<<#v<<":";for(auto x:v){cout<bool chmax(T &a,const T &b){if(abool chmin(T &a,const T &b){if(b mx,smx,mxc,mi,smi,mic,sum,lval,ladd; int sz; // smx[k]=sz) return ; if(lval[k]!=inf){ update_all(2*k,len/2,lval[k]); update_all(2*k+1,len/2,lval[k]); lval[k]=inf; return ; } if(ladd[k]!=0){ update_node_add(2*k,len/2,ladd[k]); update_node_add(2*k+1,len/2,ladd[k]); ladd[k]=0; } // 子が古い値なら更新.ここがポイント if(mx[2*k]>mx[k]) update_node_max(2*k,mx[k]); if(mx[2*k+1]>mx[k])update_node_max(2*k+1,mx[k]); if(mi[2*k]mx[2*k+1]){ mx[k]=mx[2*k];mxc[k]=mxc[2*k]; smx[k]=max(smx[2*k],mx[2*k+1]); }else{ mx[k]=mx[2*k];mxc[k]=mxc[2*k]+mxc[2*k+1]; smx[k]=max(smx[2*k],smx[2*k+1]); } if(mi[2*k]mi[2*k+1]){ mi[k]=mi[2*k+1];mic[k]=mic[2*k+1]; smi[k]=min(mi[2*k],smi[2*k+1]); }else{ mi[k]=mi[2*k];mic[k]=mic[2*k]+mic[2*k+1]; smi[k]=min(smi[2*k],smi[2*k+1]); } } void update_all(int k,ll len,ll x){ mx[k]=x,smx[k]=-inf,mi[k]=x,smi[k]=inf; mxc[k]=len,mic[k]=len; sum[k]=x*len; lval[k]=x,ladd[k]=0; } public: Beats(int n){ sz=1; while(sz=x) return ; if(a<=l and r<=b and smi[k]>x){ update_node_min(k,x); return ; } push(k,r-l); chmax(a,b,x,2*k,l,(l+r)/2); chmax(a,b,x,2*k+1,(l+r)/2,r); update_from_children(k); } void add(int a,int b,ll x,int k=1,int l=0,int r=-1){ if(r==-1) r=sz; if(r<=a or b<=l) return ; if(a<=l and r<=b){ update_node_add(k,r-l,x); return ; } push(k,r-l); add(a,b,x,2*k,l,(l+r)/2); add(a,b,x,2*k+1,(l+r)/2,r); update_from_children(k); } void update(int a,int b,ll x,int k=1,int l=0,int r=-1){ if(r==-1)r=sz; if(r<=a or b<=l) return ; if(a<=l and r<=b){ update_all(k,r-l,x); return ; } push(k,r-l); update(a,b,x,2*k,l,(l+r)/2); update(a,b,x,2*k+1,(l+r)/2,r); update_from_children(k); } ll query_sum(int a,int b,int k=1,int l=0,int r=-1){ if(r==-1)r=sz; if(r<=a or b<=l)return 0; if(a<=l and r<=b) return sum[k]; push(k,r-l); ll lsum=query_sum(a,b,2*k,l,(l+r)/2); ll rsum=query_sum(a,b,2*k+1,(l+r)/2,r); return lsum+rsum; } ll query_min(int a,int b,int k=1,int l=0,int r=-1){ if(r==-1)r=sz; if(b<=l or r<=a) return inf; if(a<=l and r<=b) return mi[k]; push(k,r-l); ll lmin=query_min(a,b,2*k,l,(l+r)/2); ll rmin=query_min(a,b,2*k+1,(l+r)/2,r); return min(lmin,rmin); } ll query_max(int a,int b,int k=1,int l=0,int r=-1){ if(r==-1)r=sz; if(b<=l or r<=a) return -inf; if(a<=l and r<=b) return mx[k]; push(k,r-l); ll lmax=query_max(a,b,2*k,l,(l+r)/2); ll rmax=query_max(a,b,2*k+1,(l+r)/2,r); return max(lmax,rmax); } }; signed main(){ cin.tie(0); ios::sync_with_stdio(0); int n;cin>>n; map l,r; set st; rep(i,n){ int x;cin>>x; st.insert(x); if(!l.count(x)) l[x]=i; else l[x]=min(l[x],i); if(!r.count(x)) r[x]=i; else r[x]=max(r[x],i); } Beats seg(n); seg.build(); for(auto x:st) seg.update(l[x],r[x]+1,x); rep(i,n) cout<