Skip to main content

competitive/data_structure/
implicit_splay_tree.rs

1use super::{
2    Allocator, LazyMapMonoid, MemoryPool,
3    binary_search_tree::{
4        BstDataAccess, BstDataMutRef, BstNode, BstRoot, BstSeeker, BstSpec, EqualSide,
5        data::{self, LazyMapElement},
6        node::WithNoParent,
7        seeker::{SeekByAccCond, SeekByRaccCond, SeekBySize},
8        split::Split3,
9    },
10    splay_operations,
11};
12use std::{
13    cmp::Ordering,
14    fmt::{self, Debug},
15    marker::PhantomData,
16    mem::{ManuallyDrop, replace},
17    ops::{DerefMut, RangeBounds},
18};
19
20type ImplicitSplayTreeRoot<T> = BstRoot<ImplicitSplayTreeSpec<T>>;
21type ImplicitSplayTreeNode<T> = BstNode<ImplicitSplayTreeData<T>>;
22
23pub struct ImplicitSplayTreeSpec<T> {
24    _marker: PhantomData<fn() -> T>,
25}
26
27pub struct ImplicitSplayTreeData<T>
28where
29    T: LazyMapMonoid,
30{
31    value: LazyMapElement<T>,
32    size: usize,
33    rev: bool,
34}
35
36impl<T> Debug for ImplicitSplayTreeData<T>
37where
38    T: LazyMapMonoid<Key: Debug, Agg: Debug, Act: Debug>,
39{
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        f.debug_struct("ImplicitSplayTreeData")
42            .field("value", &self.value)
43            .field("size", &self.size)
44            .field("rev", &self.rev)
45            .finish()
46    }
47}
48
49impl<T> BstDataAccess<data::marker::Size> for ImplicitSplayTreeData<T>
50where
51    T: LazyMapMonoid,
52{
53    type Value = usize;
54
55    fn bst_data(&self) -> &Self::Value {
56        &self.size
57    }
58
59    fn bst_data_mut(&mut self) -> &mut Self::Value {
60        &mut self.size
61    }
62}
63
64impl<T> BstDataAccess<data::marker::LazyMap> for ImplicitSplayTreeData<T>
65where
66    T: LazyMapMonoid,
67{
68    type Value = LazyMapElement<T>;
69
70    fn bst_data(&self) -> &Self::Value {
71        &self.value
72    }
73
74    fn bst_data_mut(&mut self) -> &mut Self::Value {
75        &mut self.value
76    }
77}
78
79impl<T> ImplicitSplayTreeSpec<T>
80where
81    T: LazyMapMonoid,
82{
83    fn update_act(mut node: BstDataMutRef<'_, Self>, act: &T::Act) {
84        if T::is_act_unit(act) {
85            return;
86        }
87        T::act_operate_assign(&mut node.data_mut().value.act, act);
88        node.data_mut().value.key = T::act_key(&node.reborrow().into_data().value.key, act);
89        if let Some(agg) = T::act_agg(&node.reborrow().into_data().value.agg, act) {
90            node.data_mut().value.agg = agg;
91        } else {
92            Self::top_down(node.reborrow_datamut());
93            Self::bottom_up(node);
94        }
95    }
96
97    fn reverse(mut node: BstDataMutRef<'_, Self>) {
98        node.swap_children();
99        let data = node.data_mut();
100        T::toggle(&mut data.value.agg);
101        data.rev ^= true;
102    }
103}
104
105impl<T> BstSpec for ImplicitSplayTreeSpec<T>
106where
107    T: LazyMapMonoid,
108{
109    type Parent = WithNoParent<Self::Data>;
110    type Data = ImplicitSplayTreeData<T>;
111
112    fn top_down(mut node: BstDataMutRef<'_, Self>) {
113        if !T::is_act_unit(&node.reborrow().into_data().value.act) {
114            let act = replace(&mut node.data_mut().value.act, T::act_unit());
115            if let Ok(left) = node.reborrow_datamut().left().descend() {
116                Self::update_act(left, &act);
117            }
118            if let Ok(right) = node.reborrow_datamut().right().descend() {
119                Self::update_act(right, &act);
120            }
121        }
122        if node.reborrow().into_data().rev {
123            node.data_mut().rev = false;
124            if let Ok(left) = node.reborrow_datamut().left().descend() {
125                Self::reverse(left);
126            }
127            if let Ok(right) = node.reborrow_datamut().right().descend() {
128                Self::reverse(right);
129            }
130        }
131    }
132
133    fn bottom_up(mut node: BstDataMutRef<'_, Self>) {
134        let mut agg = T::single_agg(&node.reborrow().into_data().value.key);
135        let mut size = 1;
136        if let Ok(left) = node.reborrow().left().descend() {
137            let data = left.into_data();
138            agg = T::agg_operate(&data.value.agg, &agg);
139            size += data.size;
140        }
141        if let Ok(right) = node.reborrow().right().descend() {
142            let data = right.into_data();
143            agg = T::agg_operate(&agg, &data.value.agg);
144            size += data.size;
145        }
146        let data = node.data_mut();
147        data.value.agg = agg;
148        data.size = size;
149    }
150
151    fn merge(
152        left: Option<ImplicitSplayTreeRoot<T>>,
153        right: Option<ImplicitSplayTreeRoot<T>>,
154    ) -> Option<ImplicitSplayTreeRoot<T>> {
155        splay_operations::merge(left, right)
156    }
157
158    fn split<Seeker>(
159        node: Option<ImplicitSplayTreeRoot<T>>,
160        seeker: Seeker,
161        equal_side: EqualSide,
162    ) -> (
163        Option<ImplicitSplayTreeRoot<T>>,
164        Option<ImplicitSplayTreeRoot<T>>,
165    )
166    where
167        Seeker: BstSeeker<Spec = Self>,
168    {
169        splay_operations::split(node, seeker, equal_side)
170    }
171}
172
173pub struct ImplicitSplayTree<T, A = MemoryPool<ImplicitSplayTreeNode<T>>>
174where
175    T: LazyMapMonoid,
176    A: Allocator<ImplicitSplayTreeNode<T>>,
177{
178    root: Option<ImplicitSplayTreeRoot<T>>,
179    length: usize,
180    allocator: ManuallyDrop<A>,
181    _marker: PhantomData<fn() -> T>,
182}
183
184impl<T, A> Default for ImplicitSplayTree<T, A>
185where
186    T: LazyMapMonoid,
187    A: Allocator<ImplicitSplayTreeNode<T>> + Default,
188{
189    fn default() -> Self {
190        Self {
191            root: None,
192            length: 0,
193            allocator: ManuallyDrop::new(A::default()),
194            _marker: PhantomData,
195        }
196    }
197}
198
199impl<T, A> Drop for ImplicitSplayTree<T, A>
200where
201    T: LazyMapMonoid,
202    A: Allocator<ImplicitSplayTreeNode<T>>,
203{
204    fn drop(&mut self) {
205        unsafe {
206            if let Some(root) = self.root.take() {
207                root.into_dying().drop_all(self.allocator.deref_mut());
208            }
209            ManuallyDrop::drop(&mut self.allocator);
210        }
211    }
212}
213
214impl<T> ImplicitSplayTree<T>
215where
216    T: LazyMapMonoid,
217{
218    pub fn new() -> Self {
219        Self::default()
220    }
221
222    pub fn with_capacity(capacity: usize) -> Self {
223        Self {
224            root: None,
225            length: 0,
226            allocator: ManuallyDrop::new(MemoryPool::with_capacity(capacity)),
227            _marker: PhantomData,
228        }
229    }
230}
231
232impl<T, A> ImplicitSplayTree<T, A>
233where
234    T: LazyMapMonoid,
235    A: Allocator<ImplicitSplayTreeNode<T>>,
236{
237    fn node(&mut self, key: T::Key) -> ImplicitSplayTreeRoot<T> {
238        BstRoot::from_data(
239            ImplicitSplayTreeData {
240                value: LazyMapElement::from_key(key),
241                size: 1,
242                rev: false,
243            },
244            self.allocator.deref_mut(),
245        )
246    }
247
248    #[inline]
249    fn splay<Seeker>(&mut self, seeker: Seeker) -> Option<Ordering>
250    where
251        Seeker: BstSeeker<Spec = ImplicitSplayTreeSpec<T>>,
252    {
253        let (ordering, root) = splay_operations::splay(self.root.take()?, seeker);
254        self.root = Some(root);
255        Some(ordering)
256    }
257
258    pub fn len(&self) -> usize {
259        self.length
260    }
261
262    pub fn is_empty(&self) -> bool {
263        self.length == 0
264    }
265
266    pub fn update<R>(&mut self, range: R, act: T::Act)
267    where
268        R: RangeBounds<usize>,
269    {
270        let mut split = Split3::seek_by_size(&mut self.root, range);
271        if let Some(root) = split.mid_datamut() {
272            ImplicitSplayTreeSpec::update_act(root, &act);
273        }
274    }
275
276    pub fn fold<R>(&mut self, range: R) -> T::Agg
277    where
278        R: RangeBounds<usize>,
279    {
280        let split = Split3::seek_by_size(&mut self.root, range);
281        split
282            .mid()
283            .map(|node| node.into_data().value.agg.clone())
284            .unwrap_or_else(T::agg_unit)
285    }
286
287    pub fn reverse<R>(&mut self, range: R)
288    where
289        R: RangeBounds<usize>,
290    {
291        let mut split = Split3::seek_by_size(&mut self.root, range);
292        if let Some(root) = split.mid_datamut() {
293            ImplicitSplayTreeSpec::reverse(root);
294        }
295    }
296
297    pub fn get(&mut self, index: usize) -> Option<&T::Key> {
298        if index >= self.length {
299            return None;
300        }
301        self.splay(SeekBySize::new(index));
302        Some(&self.root.as_ref()?.reborrow().into_data().value.key)
303    }
304
305    pub fn modify<F>(&mut self, index: usize, f: F)
306    where
307        F: FnOnce(&T::Key) -> T::Key,
308    {
309        assert!(index < self.length);
310        self.splay(SeekBySize::new(index));
311        let mut root = self.root.as_mut().unwrap().borrow_datamut();
312        ImplicitSplayTreeSpec::top_down(root.reborrow_datamut());
313        {
314            let data = root.data_mut();
315            data.value.key = f(&data.value.key);
316        }
317        ImplicitSplayTreeSpec::bottom_up(root);
318    }
319
320    pub fn insert(&mut self, index: usize, key: T::Key) {
321        assert!(index <= self.length);
322        let mut node = self.node(key);
323        if self.root.is_none() {
324            self.root = Some(node);
325        } else if index == self.length {
326            self.splay(SeekBySize::new(index));
327            unsafe { node.borrow_mut().left_mut().set(self.root.take().unwrap()) };
328            ImplicitSplayTreeSpec::bottom_up(node.borrow_datamut());
329            self.root = Some(node);
330        } else {
331            self.splay(SeekBySize::new(index));
332            let mut root = self.root.take().unwrap();
333            let left = unsafe { root.borrow_mut().left_mut().take() };
334            if let Some(left) = left {
335                unsafe { node.borrow_mut().left_mut().set(left) };
336            }
337            ImplicitSplayTreeSpec::bottom_up(root.borrow_datamut());
338            unsafe { node.borrow_mut().right_mut().set(root) };
339            ImplicitSplayTreeSpec::bottom_up(node.borrow_datamut());
340            self.root = Some(node);
341        }
342        self.length += 1;
343    }
344
345    pub fn remove(&mut self, index: usize) -> Option<T::Key> {
346        if index >= self.length {
347            return None;
348        }
349        self.splay(SeekBySize::new(index));
350        let mut node = self.root.take().unwrap();
351        ImplicitSplayTreeSpec::top_down(node.borrow_datamut());
352        let left = unsafe { node.borrow_mut().left_mut().take() };
353        let right = unsafe { node.borrow_mut().right_mut().take() };
354        self.root = ImplicitSplayTreeSpec::merge(left, right);
355        self.length -= 1;
356        let data = unsafe { node.into_dying().into_data(self.allocator.deref_mut()) };
357        Some(data.value.key)
358    }
359
360    pub fn partition_point_acc<F>(&mut self, left: usize, mut pred: F) -> usize
361    where
362        F: FnMut(&T::Agg) -> bool,
363    {
364        let mut split3 = Split3::seek_by_size(&mut self.root, left..);
365        let front_size = split3
366            .left()
367            .map(|node| node.into_data().size)
368            .unwrap_or_default();
369        let split = split3.split_mid(SeekByAccCond::new(|acc| !pred(acc)), EqualSide::Right);
370        let index = split
371            .left()
372            .map(|node| node.into_data().size)
373            .unwrap_or_default();
374        front_size + index
375    }
376
377    pub fn rpartition_point_acc<F>(&mut self, right: usize, mut pred: F) -> usize
378    where
379        F: FnMut(&T::Agg) -> bool,
380    {
381        let mut split3 = Split3::seek_by_size(&mut self.root, ..right);
382        let split = split3.split_mid(SeekByRaccCond::new(|acc| !pred(acc)), EqualSide::Left);
383        split
384            .left()
385            .map(|node| node.into_data().size)
386            .unwrap_or_default()
387    }
388
389    pub fn rotate_left(&mut self, mid: usize) {
390        assert!(mid <= self.length);
391        if mid == 0 || mid == self.length {
392            return;
393        }
394        let (left, right) =
395            ImplicitSplayTreeSpec::split(self.root.take(), SeekBySize::new(mid), EqualSide::Right);
396        self.root = ImplicitSplayTreeSpec::merge(right, left);
397    }
398
399    pub fn rotate_right(&mut self, k: usize) {
400        assert!(k <= self.length);
401        self.rotate_left(self.length - k);
402    }
403}
404
405impl<T, A> Extend<T::Key> for ImplicitSplayTree<T, A>
406where
407    T: LazyMapMonoid,
408    A: Allocator<ImplicitSplayTreeNode<T>>,
409{
410    fn extend<I>(&mut self, iter: I)
411    where
412        I: IntoIterator<Item = T::Key>,
413    {
414        let nodes = iter
415            .into_iter()
416            .map(|key| self.node(key))
417            .collect::<Vec<_>>();
418        let len = nodes.len();
419        let root = if len == 0 {
420            None
421        } else {
422            let mut stack = Vec::with_capacity(64);
423            stack.push((0, len, None::<(usize, usize)>, false));
424            while let Some((start, end, parent, visited)) = stack.pop() {
425                if start == end {
426                    continue;
427                }
428                let mid = start + (end - start) / 2;
429                if visited {
430                    ImplicitSplayTreeSpec::bottom_up(
431                        BstRoot::new(nodes[mid].node).borrow_datamut(),
432                    );
433                    continue;
434                }
435                if let Some((parent, direction)) = parent {
436                    let mut parent = nodes[parent].node;
437                    unsafe { parent.as_mut().child[direction] = Some(nodes[mid].node) };
438                }
439                stack.push((start, end, parent, true));
440                stack.push((mid + 1, end, Some((mid, 1)), false));
441                stack.push((start, mid, Some((mid, 0)), false));
442            }
443            Some(BstRoot::new(nodes[len / 2].node))
444        };
445        self.root = ImplicitSplayTreeSpec::merge(self.root.take(), root);
446        self.length += len;
447    }
448}
449
450#[cfg(test)]
451mod tests {
452    use super::*;
453    use crate::{
454        algebra::RangeMaxRangeUpdate,
455        rand,
456        tools::{NotEmptySegment, Xorshift},
457    };
458
459    #[test]
460    fn test_implicit_splay_tree() {
461        const N: usize = 1_000;
462        const Q: usize = 20_000;
463        const A: i64 = 1_000_000_000;
464
465        let mut rng = Xorshift::default();
466        rand!(rng, mut arr: [-A..A; N]);
467        let mut tree = ImplicitSplayTree::<RangeMaxRangeUpdate<_>>::new();
468        tree.extend(arr.iter().copied());
469        for _ in 0..Q {
470            assert_eq!(arr.len(), tree.len());
471            rand!(rng, ty: 0..10, (l, r): NotEmptySegment(arr.len()));
472            match ty {
473                0 if arr.len() < N * 2 => {
474                    rand!(rng, i: ..=arr.len(), x: -A..A);
475                    tree.insert(i, x);
476                    arr.insert(i, x);
477                }
478                1 if arr.len() > 1 => {
479                    rand!(rng, i: ..arr.len());
480                    assert_eq!(arr.remove(i), tree.remove(i).unwrap());
481                }
482                2 => assert_eq!(tree.fold(l..r), *arr[l..r].iter().max().unwrap()),
483                3 => {
484                    rand!(rng, x: -A..A);
485                    tree.update(l..r, Some(x));
486                    arr[l..r].fill(x);
487                }
488                4 => {
489                    tree.reverse(l..r);
490                    arr[l..r].reverse();
491                }
492                5 => {
493                    rand!(rng, left: ..=arr.len(), x: -A..A);
494                    assert_eq!(
495                        tree.partition_point_acc(left, |&value| value < x),
496                        arr[left..]
497                            .iter()
498                            .scan(i64::MIN, |acc, &value| {
499                                *acc = (*acc).max(value);
500                                Some(*acc)
501                            })
502                            .position(|value| value >= x)
503                            .map_or(arr.len(), |index| left + index),
504                    );
505                }
506                6 => {
507                    rand!(rng, right: ..=arr.len(), x: -A..A);
508                    assert_eq!(
509                        tree.rpartition_point_acc(right, |&value| value < x),
510                        arr[..right]
511                            .iter()
512                            .rev()
513                            .scan(i64::MIN, |acc, &value| {
514                                *acc = (*acc).max(value);
515                                Some(*acc)
516                            })
517                            .position(|value| value >= x)
518                            .map_or(0, |index| right - index),
519                    );
520                }
521                7 => {
522                    rand!(rng, mid: ..=arr.len());
523                    tree.rotate_left(mid);
524                    arr.rotate_left(mid);
525                }
526                8 => {
527                    rand!(rng, count: ..=arr.len());
528                    tree.rotate_right(count);
529                    arr.rotate_right(count);
530                }
531                _ => {
532                    rand!(rng, index: ..arr.len(), value: -A..A);
533                    tree.modify(index, |_| value);
534                    arr[index] = value;
535                }
536            }
537            assert_eq!(tree.get(tree.len()), None);
538            rand!(rng, index: ..arr.len());
539            assert_eq!(tree.get(index), arr.get(index));
540        }
541    }
542}