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: &mut Self::T, b: &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(..)); 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(..)); 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: &mut Self::T, b: &Self::T) {
111 if *a > *b {
112 *a = *b;
113 }
114 }
115 }
116
117 let values = vec![7, 3, 9, 1, 6, 2, 8, 4];
118 let seg_tree = SegTree::<MinSpec>::from_vec(&values);
119
120 println!("Values: {:?}", values);
121 println!("Min of entire array: {}", seg_tree.query(..)); println!("Min of [2, 5): {}", seg_tree.query(2..5)); println!("Min of [0, 3): {}", seg_tree.query(..3)); println!("Min of [5, 8): {}", seg_tree.query(5..)); println!();
126}
127
128fn custom_lazy_example() {
130 println!("4. Custom LazySegTree for Range Add + Range Sum");
131 println!("----------------------------------------------");
132
133 struct RangeAddSum;
135
136 impl LazySegTreeSpec for RangeAddSum {
137 type T = i64; type U = i64; const ID: Self::T = 0;
140
141 fn op_on_data(d1: &mut Self::T, d2: &Self::T) {
143 *d1 += *d2;
144 }
145
146 fn op_on_update(u1: &mut Self::U, u2: &Self::U) {
148 *u1 += *u2;
149 }
150
151 fn op_update_on_data(u: &Self::U, d: &mut Self::T, size: usize) {
153 *d += u * (size as i64);
154 }
155 }
156
157 let values = vec![1i64, 2, 3, 4, 5];
158 let mut lazy_tree = LazySegTree::<RangeAddSum>::from_vec(&values);
159
160 println!("Initial values: {:?}", values);
161 println!("Initial sum [1, 4): {}", lazy_tree.query(1..4)); println!("Initial sum [0, 5): {}", lazy_tree.query(..)); lazy_tree.update(1..4, 10);
166 println!("\nAfter adding 10 to range [1, 4):");
167 println!("Sum [1, 4): {}", lazy_tree.query(1..4)); println!("Sum [0, 5): {}", lazy_tree.query(..)); lazy_tree.update(..2, 5);
172 println!("\nAfter adding 5 to range [0, 2):");
173 println!("Sum [0, 2): {}", lazy_tree.query(..2)); println!("Sum [0, 5): {}", lazy_tree.query(..)); println!();
176}
177
178fn lazy_helper_example() {
180 println!("5. LazySegTree Helper Types");
181 println!("--------------------------");
182
183 let values = vec![2i32, 4, 6, 8, 10];
185 let mut sum_tree = LazySegTreeAddSum::<i32>::from_vec(&values);
186
187 println!("Initial values: {:?}", values);
188 println!("Sum [0, 5): {}", sum_tree.query(..)); println!("Sum [1, 4): {}", sum_tree.query(1..4)); sum_tree.update(1..4, 3);
193 println!("\nAfter adding 3 to range [1, 4):");
194 println!("Sum [0, 5): {}", sum_tree.query(..)); println!("Sum [1, 4): {}", sum_tree.query(1..4)); sum_tree.update(..3, -2);
199 println!("\nAfter subtracting 2 from range [0, 3):");
200 println!("Sum [0, 5): {}", sum_tree.query(..)); println!("Sum [0, 3): {}", sum_tree.query(..3)); let min_values = vec![5, 2, 8, 1, 9, 3];
205 let mut min_tree = LazySegTreeAddMin::<i32>::from_vec(&min_values);
206 println!("\nInitial min values: {:?}", min_values);
207 println!("Min [0, 6): {}", min_tree.query(..)); min_tree.update(1..4, 2);
209 println!(
210 "After adding 2 to [1, 4): Min [0, 6): {}",
211 min_tree.query(..)
212 ); let rep_values = vec![1, 2, 3, 4, 5];
216 let mut rep_tree = LazySegTreeReplaceSum::<i32>::from_vec(&rep_values);
217 println!("\nInitial replace values: {:?}", rep_values);
218 println!("Sum [0, 5): {}", rep_tree.query(..)); rep_tree.update(1..4, 10); println!(
221 "After replacing [1, 4) with 10: Sum [0, 5): {}",
222 rep_tree.query(..)
223 ); println!();
225}
226
227fn advanced_lazy_example() {
229 println!("6. Advanced Lazy Operations");
230 println!("--------------------------");
231
232 let values = vec![1i32, 1, 1, 1, 1, 1, 1, 1]; let mut tree = LazySegTreeAddSum::<i32>::from_vec(&values);
234
235 println!("Initial: 8 ones, sum = {}", tree.query(..));
236
237 tree.update(..4, 2); tree.update(2..6, 3); tree.update(4.., 1); println!("After overlapping updates:");
243 println!("Range [0, 2): sum = {}", tree.query(..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..)); println!("Total sum: {}", tree.query(..)); let mut total = 0;
251 for i in 0..4 {
252 let range_sum = tree.query(i * 2..(i + 1) * 2);
253 total += range_sum;
254 println!(" Range [{}, {}): {}", i * 2, (i + 1) * 2, range_sum);
255 }
256 println!("Sum verification: {}", total);
257 println!();
258}