Skip to content

Commit feb1ad6

Browse files
committed
fix: splay tree
1 parent 73315cb commit feb1ad6

1 file changed

Lines changed: 18 additions & 16 deletions

File tree

data-structure/link-cut-tree/splay-tree-base.hpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ struct SplayTreeBase{
5555
}
5656
}
5757
}
58+
void splay_kth(Ptr &t,int k){
59+
assert(0<=k&&k<size(t));
60+
while(true){
61+
push(t);
62+
if(k<size(t->l))t=t->l;
63+
else if(size(t->l)==k)break;
64+
else{
65+
k-=size(t->l)+1;
66+
t=t->r;
67+
}
68+
}
69+
splay(t);
70+
}
5871
Ptr get_first(Ptr t){
5972
while(t->l)push(t),t=t->l;
6073
splay(t);
@@ -79,22 +92,11 @@ struct SplayTreeBase{
7992
if(!t)return {nullptr,nullptr};
8093
if(k==0)return {nullptr,t};
8194
if(k==size(t))return {t,nullptr};
82-
push(t);
83-
if(k<=size(t->l)){
84-
auto x=split(t->l,k);
85-
t->l=x.second;
86-
t->p=nullptr;
87-
if(x.second)x.second->p=t;
88-
pull(t);
89-
return {x.first,t};
90-
}else{
91-
auto x=split(t->r,k-size(t->l)-1);
92-
t->r=x.first;
93-
t->p=nullptr;
94-
if(x.first)x.first->p=t;
95-
pull(t);
96-
return {t,x.second};
97-
}
95+
splay_kth(t,k-1);
96+
Ptr x=t->r;
97+
t->r=x->p=nullptr;
98+
pull(t);
99+
return {t,x};
98100
}
99101
void insert(Ptr &t,int k,Ptr v){
100102
splay(t);

0 commit comments

Comments
 (0)