use array_range_query::{
LazySegTree, LazySegTreeAddMin, LazySegTreeAddSum, LazySegTreeReplaceSum, LazySegTreeSpec,
SegTree, SegTreeMax, SegTreeMin, SegTreeSpec, SegTreeSum,
};
fn main() {
println!("=== Basic Segment Tree Examples ===\n");
custom_sum_example();
helper_types_example();
custom_min_example();
println!("\n=== Lazy Segment Tree Examples ===\n");
custom_lazy_example();
lazy_helper_example();
advanced_lazy_example();
}
fn custom_sum_example() {
println!("1. Custom SegTree for Sum Operations");
println!("-----------------------------------");
struct SumSpec;
impl SegTreeSpec for SumSpec {
type T = i64;
const ID: Self::T = 0;
fn op(a: &mut Self::T, b: &Self::T) {
*a += *b;
}
}
let values = vec![1, 2, 3, 4, 5];
println!("Initial values: {:?}", values);
let mut seg_tree = SegTree::<SumSpec>::from_vec(values);
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);
println!("\nAfter updating index 2 to 10:");
println!("Sum of range [1, 4): {}", seg_tree.query(1..4)); println!("Sum of entire array [0, 5): {}", seg_tree.query(..)); println!();
}
fn helper_types_example() {
println!("2. Helper Types for Common Operations");
println!("------------------------------------");
let values = vec![3, 1, 4, 1, 5, 9, 2, 6, 5, 3];
println!("Values: {:?}", values);
let mut sum_tree = SegTreeSum::<i32>::from_slice(&values);
println!("Range sum [2, 6): {}", sum_tree.query(2..6));
let mut min_tree = SegTreeMin::<i32>::from_slice(&values);
println!("Range min [2, 6): {}", min_tree.query(2..6));
let mut max_tree = SegTreeMax::<i32>::from_slice(&values);
println!("Range max [2, 6): {}", max_tree.query(2..6));
println!("\nAfter updating index 3 to 20:");
sum_tree.update(3, 20);
min_tree.update(3, 20);
max_tree.update(3, 20);
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!();
}
fn custom_min_example() {
println!("3. Custom Min Operation with Details");
println!("-----------------------------------");
struct MinSpec;
impl SegTreeSpec for MinSpec {
type T = i32;
const ID: Self::T = i32::MAX;
fn op(a: &mut Self::T, b: &Self::T) {
if *a > *b {
*a = *b;
}
}
}
let values = vec![7, 3, 9, 1, 6, 2, 8, 4];
println!("Values: {:?}", values);
let seg_tree = SegTree::<MinSpec>::from_vec(values);
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!();
}
fn custom_lazy_example() {
println!("4. Custom LazySegTree for Range Add + Range Sum");
println!("----------------------------------------------");
struct RangeAddSum;
impl LazySegTreeSpec for RangeAddSum {
type T = i64; type U = i64; const ID: Self::T = 0;
fn op_on_data(d1: &mut Self::T, d2: &Self::T) {
*d1 += *d2;
}
fn op_on_update(u1: &mut Self::U, u2: &Self::U) {
*u1 += *u2;
}
fn op_update_on_data(u: &Self::U, d: &mut Self::T, size: usize) {
*d += u * (size as i64);
}
}
let values = vec![1i64, 2, 3, 4, 5];
println!("Initial values: {:?}", values);
let mut lazy_tree = LazySegTree::<RangeAddSum>::from_vec(values);
println!("Initial sum [1, 4): {}", lazy_tree.query(1..4)); println!("Initial sum [0, 5): {}", lazy_tree.query(..));
lazy_tree.update(1..4, 10);
println!("\nAfter adding 10 to range [1, 4):");
println!("Sum [1, 4): {}", lazy_tree.query(1..4)); println!("Sum [0, 5): {}", lazy_tree.query(..));
lazy_tree.update(..2, 5);
println!("\nAfter adding 5 to range [0, 2):");
println!("Sum [0, 2): {}", lazy_tree.query(..2)); println!("Sum [0, 5): {}", lazy_tree.query(..)); println!();
}
fn lazy_helper_example() {
println!("5. LazySegTree Helper Types");
println!("--------------------------");
let values = vec![2i32, 4, 6, 8, 10];
println!("Initial values: {:?}", values);
let mut sum_tree = LazySegTreeAddSum::<i32>::from_vec(values);
println!("Sum [0, 5): {}", sum_tree.query(..)); println!("Sum [1, 4): {}", sum_tree.query(1..4));
sum_tree.update(1..4, 3);
println!("\nAfter adding 3 to range [1, 4):");
println!("Sum [0, 5): {}", sum_tree.query(..)); println!("Sum [1, 4): {}", sum_tree.query(1..4));
sum_tree.update(..3, -2);
println!("\nAfter subtracting 2 from range [0, 3):");
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];
println!("\nInitial min values: {:?}", min_values);
let mut min_tree = LazySegTreeAddMin::<i32>::from_vec(min_values);
println!("Min [0, 6): {}", min_tree.query(..)); min_tree.update(1..4, 2);
println!(
"After adding 2 to [1, 4): Min [0, 6): {}",
min_tree.query(..)
);
let rep_values = vec![1, 2, 3, 4, 5];
println!("\nInitial replace values: {:?}", rep_values);
let mut rep_tree = LazySegTreeReplaceSum::<i32>::from_vec(rep_values);
println!("Sum [0, 5): {}", rep_tree.query(..)); rep_tree.update(1..4, 10); println!(
"After replacing [1, 4) with 10: Sum [0, 5): {}",
rep_tree.query(..)
); println!();
}
fn advanced_lazy_example() {
println!("6. Advanced Lazy Operations");
println!("--------------------------");
let values = vec![1i32, 1, 1, 1, 1, 1, 1, 1]; println!("Initial: 8 ones, sum = {}", 8);
let mut tree = LazySegTreeAddSum::<i32>::from_vec(values);
tree.update(..4, 2); tree.update(2..6, 3); tree.update(4.., 1);
println!("After overlapping updates:");
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;
for i in 0..4 {
let range_sum = tree.query(i * 2..(i + 1) * 2);
total += range_sum;
println!(" Range [{}, {}): {}", i * 2, (i + 1) * 2, range_sum);
}
println!("Sum verification: {}", total);
println!();
}