1use 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
21pub struct TreapNode<M: ActedMonoid> {
25 val: M::Val,
27 sum: M::Val,
29 rsum: M::Val,
31 act: M::Act,
33 rev: bool,
35 prio: u32,
37 size: usize,
39 left: Option<Ptr>,
41 right: Option<Ptr>,
42}
43
44impl<M: ActedMonoid> TreapNode<M> {
45 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
63pub 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 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 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 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 pub fn push_back(&mut self, val: M::Val) {
119 self.insert(self.len(), val);
120 }
121
122 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 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 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 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 pub fn is_empty(&self) -> bool {
181 self.len() == 0
182 }
183
184 pub fn len(&self) -> usize {
186 self.root.map(|p| self.arena.get(p).size).unwrap_or(0)
187 }
188
189 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 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 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 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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 let sum = M::op(&M::op(&lsum, &val), &rsum);
345 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 #[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 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 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
386impl<M: ActedMonoid> ImplicitTreap<M> {
389 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 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 self.root = self.merge(a, b);
408
409 (acc, l + take)
410 }
411
412 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 let tmp = M::op(acc, &lsum);
434 if !f(tmp.clone()) {
435 return self.max_right_inner(l, f, acc);
437 }
438
439 *acc = tmp;
441
442 let tmp2 = M::op(acc, &val);
444 if !f(tmp2.clone()) {
445 return lsize;
447 }
448
449 *acc = tmp2;
451
452 lsize + 1 + self.max_right_inner(r, f, acc)
454 }
455
456 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 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 self.root = self.merge(a, b);
475
476 (acc, r - take)
477 }
478
479 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 let tmp = M::op(&rsum, acc);
502 if !f(tmp.clone()) {
503 return self.min_left_inner(r, f, acc);
505 }
506
507 *acc = tmp;
509
510 let tmp2 = M::op(&val, acc);
512 if !f(tmp2.clone()) {
513 return rsize;
515 }
516
517 *acc = tmp2;
519
520 rsize + 1 + self.min_left_inner(l, f, acc)
522 }
523}
524
525impl<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}