1use array_range_query::{
7 LazySegTree, LazySegTreeAddMin, LazySegTreeAddSum, LazySegTreeReplaceSum, LazySegTreeSpec,
8 SegTree, SegTreeMax, SegTreeMin, SegTreeSpec, SegTreeSum,
9};
10
11fn main() {
12 println!("=== Basic Segment Tree Examples ===\n");
13
14 custom_sum_example();
16
17 helper_types_example();
19
20 custom_min_example();
22
23 println!("\n=== Lazy Segment Tree Examples ===\n");
24
25 custom_lazy_example();
27
28 lazy_helper_example();
30
31 advanced_lazy_example();
33}
34
35fn custom_sum_example() {
37 println!("1. Custom SegTree for Sum Operations");
38 println!("-----------------------------------");
39
40 struct SumSpec;
42
43 impl SegTreeSpec for SumSpec {
44 type T = i64;
45 const ID: Self::T = 0; fn op(a: &Self::T, b: &Self::T) -> Self::T {
48 a + b
49 }
50 }
51
52 let values = vec![1, 2, 3, 4, 5];
53 let mut seg_tree = SegTree::<SumSpec>::from_vec(&values);
54
55 println!("Initial values: {:?}", values);
56 println!("Sum of range [1, 4): {}", seg_tree.query(1, 4)); println!("Sum of entire array [0, 5): {}", seg_tree.query(0, 5)); seg_tree.update(2, 10);
61 println!("\nAfter updating index 2 to 10:");
62 println!("Sum of range [1, 4): {}", seg_tree.query(1, 4)); println!("Sum of entire array [0, 5): {}", seg_tree.query(0, 5)); println!();
65}
66
67fn helper_types_example() {
69 println!("2. Helper Types for Common Operations");
70 println!("------------------------------------");
71
72 let values = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3];
73 println!("Values: {:?}", values);
74
75 let mut sum_tree = SegTreeSum::<i32>::from_vec(&values);
77 println!("Range sum [2, 6): {}", sum_tree.query(2, 6)); let mut min_tree = SegTreeMin::<i32>::from_vec(&values);
81 println!("Range min [2, 6): {}", min_tree.query(2, 6)); let mut max_tree = SegTreeMax::<i32>::from_vec(&values);
85 println!("Range max [2, 6): {}", max_tree.query(2, 6)); println!("\nAfter updating index 3 to 20:");
89 sum_tree.update(3, 20);
90 min_tree.update(3, 20);
91 max_tree.update(3, 20);
92
93 println!("Range sum [2, 6): {}", sum_tree.query(2, 6)); println!("Range min [2, 6): {}", min_tree.query(2, 6)); println!("Range max [2, 6): {}", max_tree.query(2, 6)); println!();
97}
98
99fn custom_min_example() {
101 println!("3. Custom Min Operation with Details");
102 println!("-----------------------------------");
103
104 struct MinSpec;
105
106 impl SegTreeSpec for MinSpec {
107 type T = i32;
108 const ID: Self::T = i32::MAX; fn op(a: &Self::T, b: &Self::T) -> Self::T {
111 (*a).min(*b)
112 }
113 }
114
115 let values = vec![7, 3, 9, 1, 6, 2, 8, 4];
116 let seg_tree = SegTree::<MinSpec>::from_vec(&values);
117
118 println!("Values: {:?}", values);
119 println!("Min of entire array: {}", seg_tree.query(0, 8)); println!("Min of [2, 5): {}", seg_tree.query(2, 5)); println!("Min of [0, 3): {}", seg_tree.query(0, 3)); println!("Min of [5, 8): {}", seg_tree.query(5, 8)); println!();
124}
125
126fn custom_lazy_example() {
128 println!("4. Custom LazySegTree for Range Add + Range Sum");
129 println!("----------------------------------------------");
130
131 struct RangeAddSum;
133
134 impl LazySegTreeSpec for RangeAddSum {
135 type T = i64; type U = i64; const ID: Self::T = 0;
138
139 fn op_on_data(d1: &Self::T, d2: &Self::T) -> Self::T {
141 d1 + d2
142 }
143
144 fn op_on_update(u1: &Self::U, u2: &Self::U) -> Self::U {
146 u1 + u2
147 }
148
149 fn op_update_on_data(u: &Self::U, d: &Self::T, size: usize) -> Self::T {
151 d + u * (size as i64)
152 }
153 }
154
155 let values = vec![1i64, 2, 3, 4, 5];
156 let mut lazy_tree = LazySegTree::<RangeAddSum>::from_vec(&values);
157
158 println!("Initial values: {:?}", values);
159 println!("Initial sum [1, 4): {}", lazy_tree.query(1, 4)); println!("Initial sum [0, 5): {}", lazy_tree.query(0, 5)); lazy_tree.update(1, 4, 10);
164 println!("\nAfter adding 10 to range [1, 4):");
165 println!("Sum [1, 4): {}", lazy_tree.query(1, 4)); println!("Sum [0, 5): {}", lazy_tree.query(0, 5)); lazy_tree.update(0, 2, 5);
170 println!("\nAfter adding 5 to range [0, 2):");
171 println!("Sum [0, 2): {}", lazy_tree.query(0, 2)); println!("Sum [0, 5): {}", lazy_tree.query(0, 5)); println!();
174}
175
176fn lazy_helper_example() {
178 println!("5. LazySegTree Helper Types");
179 println!("--------------------------");
180
181 let values = vec![2i32, 4, 6, 8, 10];
183 let mut sum_tree = LazySegTreeAddSum::<i32>::from_vec(&values);
184
185 println!("Initial values: {:?}", values);
186 println!("Sum [0, 5): {}", sum_tree.query(0, 5)); println!("Sum [1, 4): {}", sum_tree.query(1, 4)); sum_tree.update(1, 4, 3);
191 println!("\nAfter adding 3 to range [1, 4):");
192 println!("Sum [0, 5): {}", sum_tree.query(0, 5)); println!("Sum [1, 4): {}", sum_tree.query(1, 4)); sum_tree.update(0, 3, -2);
197 println!("\nAfter subtracting 2 from range [0, 3):");
198 println!("Sum [0, 5): {}", sum_tree.query(0, 5)); println!("Sum [0, 3): {}", sum_tree.query(0, 3)); let min_values = vec![5, 2, 8, 1, 9, 3];
203 let mut min_tree = LazySegTreeAddMin::<i32>::from_vec(&min_values);
204 println!("\nInitial min values: {:?}", min_values);
205 println!("Min [0, 6): {}", min_tree.query(0, 6)); min_tree.update(1, 4, 2);
207 println!(
208 "After adding 2 to [1, 4): Min [0, 6): {}",
209 min_tree.query(0, 6)
210 ); let rep_values = vec![1, 2, 3, 4, 5];
214 let mut rep_tree = LazySegTreeReplaceSum::<i32>::from_vec(&rep_values);
215 println!("\nInitial replace values: {:?}", rep_values);
216 println!("Sum [0, 5): {}", rep_tree.query(0, 5)); rep_tree.update(1, 4, 10); println!(
219 "After replacing [1, 4) with 10: Sum [0, 5): {}",
220 rep_tree.query(0, 5)
221 ); println!();
223}
224
225fn advanced_lazy_example() {
227 println!("6. Advanced Lazy Operations");
228 println!("--------------------------");
229
230 let values = vec![1i32, 1, 1, 1, 1, 1, 1, 1]; let mut tree = LazySegTreeAddSum::<i32>::from_vec(&values);
232
233 println!("Initial: 8 ones, sum = {}", tree.query(0, 8));
234
235 tree.update(0, 4, 2); tree.update(2, 6, 3); tree.update(4, 8, 1); println!("After overlapping updates:");
241 println!("Range [0, 2): sum = {}", tree.query(0, 2)); println!("Range [2, 4): sum = {}", tree.query(2, 4)); println!("Range [4, 6): sum = {}", tree.query(4, 6)); println!("Range [6, 8): sum = {}", tree.query(6, 8)); println!("Total sum: {}", tree.query(0, 8)); let mut total = 0;
249 for i in 0..4 {
250 let range_sum = tree.query(i * 2, (i + 1) * 2);
251 total += range_sum;
252 println!(" Range [{}, {}): {}", i * 2, (i + 1) * 2, range_sum);
253 }
254 println!("Sum verification: {}", total);
255 println!();
256}