题解
#include<bits/stdc++.h>
using namespace std
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++
}
inline void Read(int& x){
char c=nc()
for(
for(x=0
}
const int N=50010
struct Node{
int vl,vr,mxl,mxr,mnl,mnr
int w,ad,co,ha,hc,mx
int id,l,r
}a[N]
int k,n,m,Rt
int Ans[N],pos[N]
int x
namespace KDT{
bool cur
inline void Up(int x){
a[x].co=a[x].hc=-1
if(a[x].l){
a[x].mxl=max(a[x].mxl,a[a[x].l].mxl)
a[x].mxr=max(a[x].mxr,a[a[x].l].mxr)
a[x].mnl=min(a[x].mnl,a[a[x].l].mnl)
a[x].mnr=min(a[x].mnr,a[a[x].l].mnr)
}
if(a[x].r){
a[x].mxl=max(a[x].mxl,a[a[x].r].mxl)
a[x].mxr=max(a[x].mxr,a[a[x].r].mxr)
a[x].mnl=min(a[x].mnl,a[a[x].r].mnl)
a[x].mnr=min(a[x].mnr,a[a[x].r].mnr)
}
}
inline bool Cmp(Node x,Node y){
return cur?x.vl<y.vl:x.vr<y.vr
}
int Build(int l,int r,bool d){
int Mid=l+r>>1
cur=d
nth_element(a+l,a+Mid,a+r+1,Cmp)
if(l<Mid)a[Mid].l=Build(l,Mid-1,d^1)
if(r>Mid)a[Mid].r=Build(Mid+1,r,d^1)
Up(Mid)
return Mid
}
inline void Down(int x){
if(a[x].l){
int y=a[x].l
a[y].mx=max(a[y].mx,max(a[x].ha+a[y].w,a[x].hc))
a[y].hc=max(a[y].hc,a[x].hc)
if(a[y].co==-1)a[y].ha=max(a[y].ha,a[x].ha+a[y].ad)
if(a[x].ad){
a[y].w+=a[x].ad
a[y].mx=max(a[y].mx,a[y].w)
if(a[y].co==-1)a[y].ad+=a[x].ad
}
if(a[x].co!=-1){
a[y].w=a[y].co=a[x].co
a[y].mx=max(a[y].mx,a[y].w)
}
a[y].ha=max(a[y].ha,a[y].ad)
a[y].hc=max(a[y].hc,a[y].co)
}
if(a[x].r){
int y=a[x].r
a[y].mx=max(a[y].mx,max(a[x].ha+a[y].w,a[x].hc))
a[y].hc=max(a[y].hc,a[x].hc)
if(a[y].co==-1)a[y].ha=max(a[y].ha,a[x].ha+a[y].ad)
if(a[x].ad){
a[y].w+=a[x].ad
a[y].mx=max(a[y].mx,a[y].w)
if(a[y].co==-1)a[y].ad+=a[x].ad
}
if(a[x].co!=-1){
a[y].w=a[y].co=a[x].co
a[y].mx=max(a[y].mx,a[y].w)
}
a[y].ha=max(a[y].ha,a[y].ad)
a[y].hc=max(a[y].hc,a[y].co)
}
a[x].ad=a[x].ha=0
}
void Update(int x,int y){
Down(x)
if(a[x].mxl<=y&&a[x].mnr>=y){
a[x].ad++
a[x].mx=max(a[x].mx,++a[x].w)
return
}
if(a[x].mnl>y||a[x].mxr<y){
a[x].co=a[x].hc=a[x].w=0
return
}
if(a[x].vl<=y&&y<=a[x].vr)a[x].mx=max(a[x].mx,++a[x].w)
if(a[x].l)Update(a[x].l,y)
if(a[x].r)Update(a[x].r,y)
}
void Clear(int x){
Down(x)
if(a[x].l)Clear(a[x].l)
if(a[x].r)Clear(a[x].r)
}
}
int main(){
Read(n)
for(int i=1
for(int i=1
Read(a[i].vl)
a[i].mnl=a[i].mxl=a[i].vl
a[i].mnr=a[i].mxr=a[i].vr
a[i].id=i
}
Rt=KDT::Build(1,m,0)
for(int i=1
KDT::Clear(Rt)
for(int i=1
for(int i=1
return 0
}