cp_library_rs/data_structure/
implicit_treap.rs

1//! implicit treap
2//!
3//! 列を管理するデータ構造
4
5use std::{
6    fmt::Debug,
7    ops::{Bound::*, RangeBounds},
8};
9
10use rand::{RngCore, SeedableRng};
11use rand_xorshift::XorShiftRng;
12
13use crate::{
14    algebraic_structure::actedmonoid::ActedMonoid,
15    tree::arena::{Arena, ArenaNode, Ptr},
16    tree::show_binary_tree::ShowBinaryTree,
17};
18
19type A<M> = Arena<TreapNode<M>>;
20
21// ========== node ==========
22
23/// Treap のノード
24pub struct TreapNode<M: ActedMonoid> {
25    /// 値
26    val: M::Val,
27    /// 集約値(正順)
28    sum: M::Val,
29    /// 集約値(逆順)
30    rsum: M::Val,
31    /// 作用
32    act: M::Act,
33    /// 反転フラグ
34    rev: bool,
35    /// ヒープの重み値
36    prio: u32,
37    /// 部分木のサイズ
38    size: usize,
39    // ポインタ
40    left: Option<Ptr>,
41    right: Option<Ptr>,
42}
43
44impl<M: ActedMonoid> TreapNode<M> {
45    /// val と prio からノードを生成
46    pub fn new(val: M::Val, prio: u32) -> Self {
47        Self {
48            sum: val.clone(),
49            rsum: val.clone(),
50            val,
51            act: M::id(),
52            rev: false,
53            prio,
54            size: 1,
55            left: None,
56            right: None,
57        }
58    }
59}
60
61impl<M: ActedMonoid> ArenaNode for TreapNode<M> {}
62
63// ========== implicit treap ==========
64
65/// Implicit Treap
66///
67/// - 動的な列を管理するデータ構造
68pub struct ImplicitTreap<M: ActedMonoid> {
69    arena: Arena<TreapNode<M>>,
70    pub root: Option<Ptr>,
71    rng: XorShiftRng,
72}
73
74impl<M: ActedMonoid> Default for ImplicitTreap<M> {
75    fn default() -> Self {
76        Self {
77            arena: A::new(),
78            root: None,
79            rng: XorShiftRng::from_os_rng(),
80        }
81    }
82}
83
84impl<M: ActedMonoid> ImplicitTreap<M> {
85    /// i 番目の要素の値を取得する(clone)
86    pub fn get(&mut self, i: usize) -> M::Val {
87        assert!(i < self.len());
88
89        let (a, bc) = self.split_nth(self.root, i);
90        let (b, c) = self.split_nth(bc, 1);
91
92        let val = match b {
93            Some(ptr) => {
94                // b は 1 要素の木だが,念のため遅延を落としてから読む
95                self.push(ptr);
96                self.arena.get(ptr).val.clone()
97            }
98            None => unreachable!(),
99        };
100
101        let bc = self.merge(b, c);
102        self.root = self.merge(a, bc);
103
104        val
105    }
106
107    /// i 番目に要素 val を挿入する
108    /// - `self.len() <= i` の場合,末尾に追加する.
109    pub fn insert(&mut self, i: usize, val: M::Val) {
110        let prio = self.rng.next_u32();
111        let (l, r) = self.split_nth(self.root, i.min(self.len()));
112        let ptr = self.arena.alloc(TreapNode::new(val, prio));
113        let mid = self.merge(l, Some(ptr));
114        self.root = self.merge(mid, r);
115    }
116
117    /// 末尾に要素 val を挿入する
118    pub fn push_back(&mut self, val: M::Val) {
119        self.insert(self.len(), val);
120    }
121
122    /// i 番目の要素を削除する
123    /// - `self.len() <= i` の場合,None を返す.
124    pub fn remove(&mut self, i: usize) {
125        if self.len() <= i {
126            return;
127        }
128        let (l, r) = self.split_nth(self.root, i);
129        let (_, r) = self.split_nth(r, 1);
130        self.root = self.merge(l, r);
131    }
132
133    /// 区間の集約値を返す
134    pub fn get_range<R: RangeBounds<usize> + Debug>(&mut self, range: R) -> M::Val {
135        let (l, r) = self.parse_range(range);
136
137        let (a, bc) = self.split_nth(self.root, l);
138        let (b, c) = self.split_nth(bc, r - l);
139
140        let ans = b
141            .map(|ptr| self.arena.get(ptr).sum.clone())
142            .unwrap_or(M::e());
143
144        let bc = self.merge(b, c);
145        self.root = self.merge(a, bc);
146        ans
147    }
148
149    /// 区間に作用を適用する
150    pub fn apply<R: RangeBounds<usize> + Debug>(&mut self, range: R, act: M::Act) {
151        let (l, r) = self.parse_range(range);
152
153        let (a, bc) = self.split_nth(self.root, l);
154        let (b, c) = self.split_nth(bc, r - l);
155
156        if let Some(ptr) = b {
157            self.apply_lazy(ptr, &act);
158        }
159
160        let bc = self.merge(b, c);
161        self.root = self.merge(a, bc);
162    }
163
164    /// 区間反転
165    pub fn reverse<R: RangeBounds<usize> + Debug>(&mut self, range: R) {
166        let (l, r) = self.parse_range(range);
167
168        let (a, bc) = self.split_nth(self.root, l);
169        let (b, c) = self.split_nth(bc, r - l);
170
171        if let Some(ptr) = b {
172            self.apply_rev(ptr);
173        }
174
175        let bc = self.merge(b, c);
176        self.root = self.merge(a, bc);
177    }
178
179    /// 空であるか判定する
180    pub fn is_empty(&self) -> bool {
181        self.len() == 0
182    }
183
184    /// 要素数をカウントする
185    pub fn len(&self) -> usize {
186        self.root.map(|p| self.arena.get(p).size).unwrap_or(0)
187    }
188
189    // ========== split / merge ==========
190
191    /// ptr を根とする木を,左から n 番目までのノードとそれ以外のノードに分解する
192    pub fn split_nth(&mut self, ptr: Option<Ptr>, n: usize) -> (Option<Ptr>, Option<Ptr>) {
193        let Some(ptr) = ptr else {
194            return (None, None);
195        };
196
197        self.push(ptr);
198
199        let node = self.arena.get(ptr);
200        let lsize = self.size_of(node.left);
201
202        if n <= lsize {
203            let (l, r) = self.split_nth(node.left, n);
204            self.arena.get_mut(ptr).left = r;
205            self.pull(ptr);
206
207            (l, Some(ptr))
208        } else {
209            let (l, r) = self.split_nth(node.right, n - lsize - 1);
210            self.arena.get_mut(ptr).right = l;
211            self.pull(ptr);
212
213            (Some(ptr), r)
214        }
215    }
216
217    /// left, right を根とする木を併合する
218    pub fn merge(&mut self, left: Option<Ptr>, right: Option<Ptr>) -> Option<Ptr> {
219        match (left, right) {
220            (None, ptr) | (ptr, None) => ptr,
221            (Some(left), Some(right)) => {
222                let pl = self.arena.get(left).prio;
223                let pr = self.arena.get(right).prio;
224
225                if pl < pr {
226                    // left を根にする
227                    self.push(left);
228                    let lr = self.arena.get(left).right;
229                    self.arena.get_mut(left).right = self.merge(lr, Some(right));
230                    self.pull(left);
231
232                    Some(left)
233                } else {
234                    // right を根にする
235                    self.push(right);
236                    let rl = self.arena.get(right).left;
237                    self.arena.get_mut(right).left = self.merge(Some(left), rl);
238                    self.pull(right);
239
240                    Some(right)
241                }
242            }
243        }
244    }
245
246    // ========== internal ==========
247
248    /// 区間の取得
249    #[inline]
250    fn parse_range<R: RangeBounds<usize> + Debug>(&self, range: R) -> (usize, usize) {
251        let start = match range.start_bound() {
252            Unbounded => 0,
253            Excluded(&v) => v + 1,
254            Included(&v) => v,
255        };
256        let end = match range.end_bound() {
257            Unbounded => self.len(),
258            Excluded(&v) => v,
259            Included(&v) => v + 1,
260        };
261        if start <= end && end <= self.len() {
262            (start, end)
263        } else {
264            panic!("The given range is wrong: {:?}", range)
265        }
266    }
267
268    /// 部分木のサイズ
269    #[inline]
270    fn size_of(&self, ptr: Option<Ptr>) -> usize {
271        ptr.map(|ptr| self.arena.get(ptr).size).unwrap_or(0)
272    }
273
274    /// 部分木の集約
275    #[inline]
276    fn sum_of(&self, ptr: Option<Ptr>) -> M::Val {
277        ptr.map(|ptr| self.arena.get(ptr).sum.clone())
278            .unwrap_or(M::e())
279    }
280
281    // 逆順集約
282    #[inline]
283    fn rsum_of(&self, ptr: Option<Ptr>) -> M::Val {
284        ptr.map(|ptr| self.arena.get(ptr).rsum.clone())
285            .unwrap_or(M::e())
286    }
287
288    /// ノード `ptr` が表す部分木全体に作用を適用
289    #[inline]
290    fn apply_lazy(&mut self, ptr: Ptr, act: &M::Act) {
291        let (nval, nsum, nrsum) = {
292            let v = self.arena.get(ptr);
293            (
294                M::mapping(&v.val, act),
295                M::mapping(&v.sum, act),
296                M::mapping(&v.rsum, act),
297            )
298        };
299        let composed = {
300            let v = self.arena.get(ptr);
301            M::compose(&v.act, act)
302        };
303
304        let v = self.arena.get_mut(ptr);
305        v.val = nval;
306        v.sum = nsum;
307        v.rsum = nrsum;
308        v.act = composed;
309    }
310
311    /// ノード `ptr` が表す部分木全体を反転(遅延)
312    #[inline]
313    fn apply_rev(&mut self, ptr: Ptr) {
314        let (l, r, sum, rsum) = {
315            let v = self.arena.get(ptr);
316            (v.left, v.right, v.sum.clone(), v.rsum.clone())
317        };
318        let v = self.arena.get_mut(ptr);
319        v.left = r;
320        v.right = l;
321        v.sum = rsum;
322        v.rsum = sum;
323        v.rev = !v.rev;
324    }
325
326    /// 子の情報を吸い上げる
327    #[inline]
328    fn pull(&mut self, ptr: Ptr) {
329        let (l, r, val) = {
330            let v = self.arena.get(ptr);
331            (v.left, v.right, v.val.clone())
332        };
333
334        let lsize = self.size_of(l);
335        let rsize = self.size_of(r);
336
337        let lsum = self.sum_of(l);
338        let rsum = self.sum_of(r);
339
340        let lrsum = self.rsum_of(l);
341        let rrsum = self.rsum_of(r);
342
343        // 正順: L + [val] + R
344        let sum = M::op(&M::op(&lsum, &val), &rsum);
345        // 逆順: reverse(R) + [val] + reverse(L)
346        let rev_sum = M::op(&M::op(&rrsum, &val), &lrsum);
347
348        let v = self.arena.get_mut(ptr);
349        v.size = lsize + rsize + 1;
350        v.sum = sum;
351        v.rsum = rev_sum;
352    }
353
354    /// 子に伝播する(act と rev の両方)
355    #[inline]
356    fn push(&mut self, ptr: Ptr) {
357        let (act, rev, l, r) = {
358            let v = self.arena.get(ptr);
359            (v.act.clone(), v.rev, v.left, v.right)
360        };
361
362        // 反転の伝播
363        if rev {
364            if let Some(lp) = l {
365                self.apply_rev(lp);
366            }
367            if let Some(rp) = r {
368                self.apply_rev(rp);
369            }
370            self.arena.get_mut(ptr).rev = false;
371        }
372
373        // 作用の伝播
374        if act != M::id() {
375            if let Some(lp) = l {
376                self.apply_lazy(lp, &act);
377            }
378            if let Some(rp) = r {
379                self.apply_lazy(rp, &act);
380            }
381            self.arena.get_mut(ptr).act = M::id();
382        }
383    }
384}
385
386// ========== binary search (like segtree max_right / min_left) ==========
387
388impl<M: ActedMonoid> ImplicitTreap<M> {
389    /// 左端固定二分探索(segtree の max_right と同じ)
390    ///
391    /// 返り値:(`get_range(l..x)`, `x`)
392    /// 条件:`f(M::e()) == true`
393    pub fn max_right<F>(&mut self, l: usize, f: F) -> (M::Val, usize)
394    where
395        F: Fn(M::Val) -> bool,
396    {
397        assert!(l <= self.len());
398        assert!(f(M::e()));
399
400        // [0, l) と [l, n) に分割
401        let (a, b) = self.split_nth(self.root, l);
402
403        let mut acc = M::e();
404        let take = self.max_right_inner(b, &f, &mut acc);
405
406        // 元に戻す
407        self.root = self.merge(a, b);
408
409        (acc, l + take)
410    }
411
412    /// `ptr` が表す列の prefix を,左から何個取れるか
413    /// 返り値:取れる要素数
414    fn max_right_inner<F>(&mut self, ptr: Option<Ptr>, f: &F, acc: &mut M::Val) -> usize
415    where
416        F: Fn(M::Val) -> bool,
417    {
418        let Some(p) = ptr else {
419            return 0;
420        };
421
422        self.push(p);
423
424        let (l, r, val) = {
425            let v = self.arena.get(p);
426            (v.left, v.right, v.val.clone())
427        };
428
429        let lsize = self.size_of(l);
430        let lsum = self.sum_of(l);
431
432        // まず左部分木を丸ごと入れられるか?
433        let tmp = M::op(acc, &lsum);
434        if !f(tmp.clone()) {
435            // 左部分木の中で探す
436            return self.max_right_inner(l, f, acc);
437        }
438
439        // 左部分木は全て入れられる
440        *acc = tmp;
441
442        // 次に現在ノード val を入れられるか?
443        let tmp2 = M::op(acc, &val);
444        if !f(tmp2.clone()) {
445            // val は入れられないので,取れるのは左部分木まで
446            return lsize;
447        }
448
449        // val も入れられる
450        *acc = tmp2;
451
452        // 右部分木へ
453        lsize + 1 + self.max_right_inner(r, f, acc)
454    }
455
456    /// 右端固定二分探索(segtree の min_left と同じ)
457    ///
458    /// 返り値:(`get_range(x..r)`, `x`)
459    /// 条件:`f(M::e()) == true`
460    pub fn min_left<F>(&mut self, r: usize, f: F) -> (M::Val, usize)
461    where
462        F: Fn(M::Val) -> bool,
463    {
464        assert!(r <= self.len());
465        assert!(f(M::e()));
466
467        // [0, r) と [r, n) に分割
468        let (a, b) = self.split_nth(self.root, r);
469
470        let mut acc = M::e();
471        let take = self.min_left_inner(a, &f, &mut acc);
472
473        // 元に戻す
474        self.root = self.merge(a, b);
475
476        (acc, r - take)
477    }
478
479    /// `ptr` が表す列の suffix を,右から何個取れるか
480    /// 返り値:取れる要素数
481    fn min_left_inner<F>(&mut self, ptr: Option<Ptr>, f: &F, acc: &mut M::Val) -> usize
482    where
483        F: Fn(M::Val) -> bool,
484    {
485        let Some(p) = ptr else {
486            return 0;
487        };
488
489        self.push(p);
490
491        let (l, r, val) = {
492            let v = self.arena.get(p);
493            (v.left, v.right, v.val.clone())
494        };
495
496        let rsize = self.size_of(r);
497        let rsum = self.sum_of(r);
498
499        // まず右部分木を丸ごと「前に付け足して」良いか?
500        // suffix を伸ばすので,新規部分は常に acc の前に来る:op(new, acc)
501        let tmp = M::op(&rsum, acc);
502        if !f(tmp.clone()) {
503            // 右部分木の中で探す
504            return self.min_left_inner(r, f, acc);
505        }
506
507        // 右部分木は全て入れられる
508        *acc = tmp;
509
510        // 次に現在ノード val を前に付け足せるか?
511        let tmp2 = M::op(&val, acc);
512        if !f(tmp2.clone()) {
513            // val は入れられないので,取れるのは右部分木まで
514            return rsize;
515        }
516
517        // val も入れられる
518        *acc = tmp2;
519
520        // 左部分木へ(さらに左に伸ばす)
521        rsize + 1 + self.min_left_inner(l, f, acc)
522    }
523}
524
525// ========== debug ==========
526
527impl<M> ShowBinaryTree<Ptr> for ImplicitTreap<M>
528where
529    M: ActedMonoid,
530    M::Val: Debug,
531    M::Act: Debug,
532{
533    fn get_root(&self) -> Option<Ptr> {
534        self.root
535    }
536    fn get_left(&self, ptr: &Ptr) -> Option<Ptr> {
537        self.arena.get(*ptr).left
538    }
539    fn get_right(&self, ptr: &Ptr) -> Option<Ptr> {
540        self.arena.get(*ptr).right
541    }
542    fn print_node(&self, ptr: &Ptr) -> String {
543        format!(
544            "[val:{:?}, sum:{:?}, act:{:?}, rev:{:?}]",
545            self.arena.get(*ptr).val,
546            self.arena.get(*ptr).sum,
547            self.arena.get(*ptr).act,
548            self.arena.get(*ptr).rev,
549        )
550    }
551}