在线段树中记录区间最小值和最大值,根据 val 求 rank 时,进行特判,可以极大地优化常数。
int Getrk(int p,int l,int r,int ql,int qr,int x){
if(r<ql||qr<l) return 0;
if(ql<=l&&r<=qr) {
if(x>mx[p]) return r-l+1+(ql==l);
if(x<mn[p]) return 0+(ql==l);
return Tp_Getrk(tr[p],x)+(ql==l);
}
int mid=(l+r)>>1;
return Getrk(Ls,l,mid,ql,qr,x)+Getrk(Rs,mid+1,r,ql,qr,x);
}