void PushUp(int k,int l,int r){
int mid=l+r>>1;
int ls=k<<1,rs=k<<1|1;
ans[k]=max(ans[ls],ans[rs]);
L[k]=L[ls],R[k]=R[rs];
Lu[k]=Lu[ls],Ld[k]=Ld[ls],Lud[k]=Lud[ls];
Ru[k]=Ru[rs],Rd[k]=Rd[rs],Rud[k]=Rud[rs];
if(R[ls]<L[rs]){
if(Lu[ls]==mid-l+1){
Lu[k]=Lu[ls]+Lu[rs];
Lud[k]=Lu[ls]+Lud[rs];
}
if(Ru[rs]==r-mid)
Ru[k]=Ru[ls]+Ru[rs];
if(Rud[rs]==r-mid)
Rud[k]=Ru[ls]+Rud[rs];
ans[k]=max(ans[k],Ru[ls]+max(Lud[rs],max(Lu[rs],Ld[rs])));
}else if(R[ls]>L[rs]){
if(Ld[ls]==mid-l+1){
Ld[k]=Ld[ls]+Ld[rs];
Lud[k]=Lud[ls]+Ld[rs];
}
if(Rd[rs]==r-mid){
Rd[k]=Rd[ls]+Rd[rs];
Rud[k]=Rud[ls]+Rd[rs];
}
ans[k]=max(ans[k],max(Rud[ls],max(Ru[ls],Rd[ls]))+Ld[rs]);
}
}
题目