1use std::{
6 cmp::Ordering,
7 fmt::Debug,
8 ops::{Bound::*, RangeBounds},
9};
10
11use rand::{RngCore, SeedableRng};
12use rand_xorshift::XorShiftRng;
13
14use crate::{
15 algebraic_structure::actedmonoid::ActedMonoid,
16 tree::arena::{Arena, ArenaNode, Ptr},
17 tree::show_binary_tree::ShowBinaryTree,
18};
19
20type A<K, M> = Arena<TreapNode<K, M>>;
21
22pub struct TreapNode<K: Ord, M: ActedMonoid> {
26 key: K,
28 val: M::Val,
30 sum: M::Val,
32 act: M::Act,
34 prio: u32,
36 size: usize,
38 left: Option<Ptr>,
40 right: Option<Ptr>,
41}
42
43impl<K: Ord, M: ActedMonoid> TreapNode<K, M> {
44 pub fn new(key: K, val: M::Val, prio: u32) -> Self {
46 Self {
47 key,
48 sum: val.clone(),
49 val,
50 act: M::id(),
51 prio,
52 size: 1,
53 left: None,
54 right: None,
55 }
56 }
57}
58
59impl<K: Ord, M: ActedMonoid> ArenaNode for TreapNode<K, M> {}
60
61#[derive(Clone, Copy)]
65enum BoundKind {
66 Lower,
68 Upper,
70}
71
72pub struct BalancedBinaryTree<K: Ord, M: ActedMonoid> {
76 arena: Arena<TreapNode<K, M>>,
77 root: Option<Ptr>,
78 rng: XorShiftRng,
79}
80
81impl<K: Ord, M: ActedMonoid> Default for BalancedBinaryTree<K, M> {
82 fn default() -> Self {
83 Self {
84 arena: A::new(),
85 root: None,
86 rng: XorShiftRng::from_os_rng(),
87 }
88 }
89}
90
91impl<K: Ord + Clone, M: ActedMonoid> BalancedBinaryTree<K, M> {
92 pub fn insert_lower(&mut self, key: K, val: M::Val) {
95 let prio = self.rng.next_u32();
96
97 let (l, r) = self.split_key_lower(self.root, &key);
99
100 let ptr = self.arena.alloc(TreapNode::new(key, val, prio));
101 let mid = self.merge(l, Some(ptr));
102 self.root = self.merge(mid, r);
103 }
104
105 pub fn insert_upper(&mut self, key: K, val: M::Val) {
108 let prio = self.rng.next_u32();
109
110 let (l, r) = self.split_key_upper(self.root, &key);
112
113 let ptr = self.arena.alloc(TreapNode::new(key, val, prio));
114 let mid = self.merge(l, Some(ptr));
115 self.root = self.merge(mid, r);
116 }
117
118 pub fn insert_unique(&mut self, key: K, val: M::Val) -> bool {
121 let prio = self.rng.next_u32();
122
123 let (a, bc) = self.split_key_lower(self.root, &key);
125
126 let (b, c) = self.split_key_upper(bc, &key);
131
132 if b.is_some() {
133 let bc2 = self.merge(b, c);
135 self.root = self.merge(a, bc2);
136 false
137 } else {
138 let ptr = self.arena.alloc(TreapNode::new(key, val, prio));
140 let ac = self.merge(a, Some(ptr));
141 self.root = self.merge(ac, c);
142 true
143 }
144 }
145
146 pub fn remove(&mut self, key: &K) -> bool {
149 let (a, bc) = self.split_key_lower(self.root, key);
151
152 let (b, c) = self.split_key_upper(bc, key);
154
155 let removed = b.is_some();
156
157 self.root = self.merge(a, c);
159
160 removed
161 }
162
163 pub fn get_range<R: RangeBounds<K> + Debug>(&mut self, range: R) -> M::Val {
165 let (a, bc) = match range.start_bound() {
167 Unbounded => (None, self.root),
168 Included(l) => self.split_key_lower(self.root, l), Excluded(l) => self.split_key_upper(self.root, l), };
171
172 let (b, c) = match range.end_bound() {
174 Unbounded => (bc, None),
175 Included(r) => {
176 self.split_key_upper(bc, r) }
179 Excluded(r) => {
180 self.split_key_lower(bc, r) }
183 };
184
185 let ans = b
186 .map(|ptr| self.arena.get(ptr).sum.clone())
187 .unwrap_or(M::e());
188
189 let bc2 = self.merge(b, c);
191 self.root = self.merge(a, bc2);
192
193 ans
194 }
195
196 pub fn apply<R: RangeBounds<K> + Debug>(&mut self, range: R, act: M::Act) {
198 let (a, bc) = match range.start_bound() {
199 Unbounded => (None, self.root),
200 Included(l) => self.split_key_lower(self.root, l), Excluded(l) => self.split_key_upper(self.root, l), };
203
204 let (b, c) = match range.end_bound() {
205 Unbounded => (bc, None),
206 Included(r) => self.split_key_upper(bc, r), Excluded(r) => self.split_key_lower(bc, r), };
209
210 if let Some(ptr) = b {
211 self.apply_lazy(ptr, &act);
212 }
213
214 let bc2 = self.merge(b, c);
215 self.root = self.merge(a, bc2);
216 }
217
218 pub fn is_empty(&self) -> bool {
220 self.len() == 0
221 }
222
223 pub fn len(&self) -> usize {
225 self.root.map(|p| self.arena.get(p).size).unwrap_or(0)
226 }
227
228 #[inline]
232 fn size_of(&self, ptr: Option<Ptr>) -> usize {
233 ptr.map(|ptr| self.arena.get(ptr).size).unwrap_or(0)
234 }
235
236 #[inline]
238 fn sum_of(&self, ptr: Option<Ptr>) -> M::Val {
239 ptr.map(|ptr| self.arena.get(ptr).sum.clone())
240 .unwrap_or(M::e())
241 }
242
243 #[inline]
245 fn apply_lazy(&mut self, ptr: Ptr, act: &M::Act) {
246 let (nval, nsum) = {
247 let v = self.arena.get(ptr);
248 (M::mapping(&v.val, act), M::mapping(&v.sum, act))
249 };
250 let composed = {
251 let v = self.arena.get(ptr);
252 M::compose(&v.act, act)
253 };
254
255 let v = self.arena.get_mut(ptr);
256 v.val = nval;
257 v.sum = nsum;
258 v.act = composed;
259 }
260
261 #[inline]
263 fn pull(&mut self, ptr: Ptr) {
264 let (l, r, val) = {
265 let v = self.arena.get(ptr);
266 (v.left, v.right, v.val.clone())
267 };
268
269 let lsize = self.size_of(l);
270 let rsize = self.size_of(r);
271
272 let lsum = self.sum_of(l);
273 let rsum = self.sum_of(r);
274
275 let sum = M::op(&M::op(&lsum, &val), &rsum);
277
278 let v = self.arena.get_mut(ptr);
279 v.size = lsize + rsize + 1;
280 v.sum = sum;
281 }
282
283 #[inline]
285 fn push(&mut self, ptr: Ptr) {
286 let (act, l, r) = {
287 let v = self.arena.get(ptr);
288 (v.act.clone(), v.left, v.right)
289 };
290
291 if act != M::id() {
293 if let Some(lp) = l {
294 self.apply_lazy(lp, &act);
295 }
296 if let Some(rp) = r {
297 self.apply_lazy(rp, &act);
298 }
299 self.arena.get_mut(ptr).act = M::id();
300 }
301 }
302
303 fn split_key_impl(
307 &mut self,
308 ptr: Option<Ptr>,
309 x: &K,
310 kind: BoundKind,
311 ) -> (Option<Ptr>, Option<Ptr>)
312 where
313 K: Clone,
314 {
315 let Some(ptr) = ptr else {
316 return (None, None);
317 };
318
319 self.push(ptr);
320
321 let (key, left, right) = {
323 let v = self.arena.get(ptr);
324 (v.key.clone(), v.left, v.right)
325 };
326
327 let go_left = match (key.cmp(x), kind) {
329 (Ordering::Less, _) => true,
330 (Ordering::Equal, BoundKind::Lower) => false, (Ordering::Equal, BoundKind::Upper) => true, (Ordering::Greater, _) => false,
333 };
334
335 if go_left {
336 let (l, r) = self.split_key_impl(right, x, kind);
338 self.arena.get_mut(ptr).right = l;
339 self.pull(ptr);
340 (Some(ptr), r)
341 } else {
342 let (l, r) = self.split_key_impl(left, x, kind);
344 self.arena.get_mut(ptr).left = r;
345 self.pull(ptr);
346 (l, Some(ptr))
347 }
348 }
349
350 fn split_key_lower(&mut self, ptr: Option<Ptr>, x: &K) -> (Option<Ptr>, Option<Ptr>)
352 where
353 K: Clone,
354 {
355 self.split_key_impl(ptr, x, BoundKind::Lower)
356 }
357
358 fn split_key_upper(&mut self, ptr: Option<Ptr>, x: &K) -> (Option<Ptr>, Option<Ptr>)
360 where
361 K: Clone,
362 {
363 self.split_key_impl(ptr, x, BoundKind::Upper)
364 }
365
366 fn split_nth(&mut self, ptr: Option<Ptr>, n: usize) -> (Option<Ptr>, Option<Ptr>) {
368 let Some(ptr) = ptr else {
369 return (None, None);
370 };
371
372 self.push(ptr);
373
374 let node = self.arena.get(ptr);
375 let lsize = self.size_of(node.left);
376
377 if n <= lsize {
378 let (l, r) = self.split_nth(node.left, n);
379 self.arena.get_mut(ptr).left = r;
380 self.pull(ptr);
381
382 (l, Some(ptr))
383 } else {
384 let (l, r) = self.split_nth(node.right, n - lsize - 1);
385 self.arena.get_mut(ptr).right = l;
386 self.pull(ptr);
387
388 (Some(ptr), r)
389 }
390 }
391
392 fn merge(&mut self, left: Option<Ptr>, right: Option<Ptr>) -> Option<Ptr> {
394 match (left, right) {
395 (None, ptr) | (ptr, None) => ptr,
396 (Some(left), Some(right)) => {
397 let pl = self.arena.get(left).prio;
398 let pr = self.arena.get(right).prio;
399
400 if pl < pr {
401 self.push(left);
403 let lr = self.arena.get(left).right;
404 self.arena.get_mut(left).right = self.merge(lr, Some(right));
405 self.pull(left);
406
407 Some(left)
408 } else {
409 self.push(right);
411 let rl = self.arena.get(right).left;
412 self.arena.get_mut(right).left = self.merge(Some(left), rl);
413 self.pull(right);
414
415 Some(right)
416 }
417 }
418 }
419 }
420}
421
422impl<K, M> ShowBinaryTree<Ptr> for BalancedBinaryTree<K, M>
425where
426 K: Ord + Debug,
427 M: ActedMonoid,
428 M::Val: Debug,
429 M::Act: Debug,
430{
431 fn get_root(&self) -> Option<Ptr> {
432 self.root
433 }
434 fn get_left(&self, ptr: &Ptr) -> Option<Ptr> {
435 self.arena.get(*ptr).left
436 }
437 fn get_right(&self, ptr: &Ptr) -> Option<Ptr> {
438 self.arena.get(*ptr).right
439 }
440 fn print_node(&self, ptr: &Ptr) -> String {
441 format!(
442 "[key:{:?}, val:{:?}, sum:{:?}, act:{:?}]",
443 self.arena.get(*ptr).key,
444 self.arena.get(*ptr).val,
445 self.arena.get(*ptr).sum,
446 self.arena.get(*ptr).act,
447 )
448 }
449}