File tree Expand file tree Collapse file tree
data-structure/link-cut-tree Expand file tree Collapse file tree Original file line number Diff line number Diff 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);
You can’t perform that action at this time.
0 commit comments