contest_algorithms/range_query/
mod.rs1pub mod dynamic_arq;
2pub mod specs;
3pub mod sqrt_decomp;
4pub mod static_arq;
5pub use dynamic_arq::{ArqView, DynamicArq};
6pub use specs::ArqSpec;
7pub use static_arq::StaticArq;
8
9#[cfg(test)]
10mod test {
11 use super::specs::*;
12 use super::*;
13
14 #[test]
15 fn test_rmq() {
16 let mut arq = StaticArq::<AssignMin>::new(&[0; 10]);
17
18 assert_eq!(arq.query(0, 9), 0);
19
20 arq.update(2, 4, &-5);
21 arq.update(5, 7, &-3);
22 arq.update(1, 6, &1);
23
24 assert_eq!(arq.query(0, 9), -3);
25 }
26
27 #[test]
28 fn test_dynamic_rmq() {
29 let mut arq = DynamicArq::<AssignMin>::new(false);
30 let view = arq.build_from_slice(&[0; 10]);
31
32 assert_eq!(arq.query(view, 0, 9), 0);
33
34 arq.update(view, 2, 4, &-5);
35 arq.update(view, 5, 7, &-3);
36 arq.update(view, 1, 6, &1);
37
38 assert_eq!(arq.query(view, 0, 9), -3);
39 }
40
41 #[test]
42 fn test_persistent_rmq() {
43 let mut arq = DynamicArq::<AssignMin>::new(true);
44 let mut view = arq.build_from_slice(&[0; 10]);
45
46 let at_init = view;
47 view = arq.update(view, 2, 4, &-5);
48 let snapshot = view;
49 view = arq.update(view, 5, 7, &-3);
50 view = arq.update(view, 1, 6, &1);
51
52 assert_eq!(arq.query(at_init, 0, 9), 0);
53 assert_eq!(arq.query(snapshot, 0, 9), -5);
54 assert_eq!(arq.query(view, 0, 9), -3);
55 }
56
57 #[test]
58 fn test_huge_rmq() {
59 let quintillion = 1_000_000_000_000_000_000;
60 let mut arq = DynamicArq::<AssignMin>::new(false);
61 let view = arq.build_from_identity(9 * quintillion + 1);
62
63 arq.update(view, 2 * quintillion, 4 * quintillion, &-5);
64 arq.update(view, 5 * quintillion, 7 * quintillion, &-3);
65 arq.update(view, 1 * quintillion, 6 * quintillion, &1);
66
67 assert_eq!(arq.query(view, 0, 9 * quintillion), -3);
68 }
69
70 #[test]
71 fn test_range_sum() {
72 let mut arq = StaticArq::<AssignSum>::new(&[0; 10]);
73
74 assert_eq!(arq.query(0, 9), 0);
75
76 arq.update(1, 3, &10);
77 arq.update(3, 5, &1);
78
79 assert_eq!(arq.query(0, 9), 23);
80 assert_eq!(arq.query(10, 4), 0);
81 }
82
83 #[test]
84 fn test_dynamic_range_sum() {
85 let mut arq = DynamicArq::<AssignSum>::new(false);
86 let view = arq.build_from_slice(&[0; 10]);
87
88 assert_eq!(arq.query(view, 0, 9), 0);
89
90 arq.update(view, 1, 3, &10);
91 arq.update(view, 3, 5, &1);
92
93 assert_eq!(arq.query(view, 0, 9), 23);
94 assert_eq!(arq.query(view, 10, 4), 0);
95 }
96
97 #[test]
98 fn test_supply_demand() {
99 let mut arq = StaticArq::<SupplyDemand>::new(&[(0, 0, 0); 10]);
100
101 arq.update(1, 1, &(25, 100));
102 arq.update(3, 3, &(100, 30));
103 arq.update(9, 9, &(0, 20));
104
105 assert_eq!(arq.query(0, 9), (125, 150, 75));
106 }
107
108 #[test]
109 fn test_dynamic_supply_demand() {
110 let mut arq = DynamicArq::<SupplyDemand>::new(false);
111 let view = arq.build_from_identity(10);
112
113 arq.update(view, 1, 1, &(25, 100));
114 arq.update(view, 3, 3, &(100, 30));
115 arq.update(view, 9, 9, &(0, 20));
116
117 assert_eq!(arq.query(view, 0, 9), (125, 150, 75));
118 }
119
120 #[test]
121 fn test_binary_search_rmq() {
122 let vec = vec![2, 1, 0, -1, -2, -3, -4, -5];
123 let mut arq = StaticArq::<AssignMin>::new(&vec);
124 let first_neg = static_arq::first_negative(&mut arq);
125
126 arq.update(3, 7, &0);
127 let first_neg_zeros = static_arq::first_negative(&mut arq);
128
129 assert_eq!(first_neg, Some(3));
130 assert_eq!(first_neg_zeros, None);
131 }
132
133 #[test]
134 fn test_dynamic_binary_search_rmq() {
135 let vec = vec![2, 1, 0, -1, -2, -3, -4, -5];
136 let mut arq = DynamicArq::<AssignMin>::new(false);
137 let view = arq.build_from_slice(&vec);
138 let first_neg = dynamic_arq::first_negative(&mut arq, view);
139
140 arq.update(view, 3, 7, &0);
141 let first_neg_zeros = dynamic_arq::first_negative(&mut arq, view);
142
143 assert_eq!(first_neg, Some(3));
144 assert_eq!(first_neg_zeros, None);
145 }
146}