ex_assign/
ex_assign.rs

1use seg_lib::{AssignSegmentTree, ops::BitXor};
2
3/// Demonstrates how to use an [`AssignSegmentTree`] for:
4/// - range XOR queries
5/// - range assign updates
6fn main() {
7    // Initialize a segment tree with values 0..100
8    let mut seg = AssignSegmentTree::<BitXor<u32>>::from_iter(0..100);
9    assert_eq!(seg.len(), 100);
10    assert_eq!(Vec::from_iter(seg.iter().copied()), Vec::from_iter(0..100));
11
12    // Assign values to a range
13    seg.range_assign(..50, 100);
14    assert!(seg.iter().take(50).all(|e| *e == 100));
15
16    // Query XOR over ranges
17    assert_eq!(seg.range_query(..50), 0); // 50 is even, so XOR cancels out
18    assert_eq!(seg.range_query(50..), (50..100).fold(0, |res, e| res ^ e));
19
20    // Assign and query a single element
21    seg.point_assign(50, !0);
22    assert_eq!(seg.point_query(50), &!0);
23}