array_range_query
A high-performance, generic implementation of segment trees and lazy segment trees in Rust for efficient range queries and range updates.
Includes helpers for:
- Range sum, min, max queries
- Range add, range assignment (replace), and lazy propagation for sum/min/max
Features
- Generic Segment Tree (
SegTree
): Supports any associative operation (monoid) with O(log n) point updates and range queries - Generic Lazy Segment Tree (
LazySegTree
): Supports range updates and range queries in O(log n) time with lazy propagation - Type-safe design: Uses the type system to ensure correctness and prevent misuse
- Comprehensive helper types: Pre-built implementations for common operations (sum, min, max)
- Zero-cost abstractions: Generic design with no runtime overhead
- Well-tested: Extensive test coverage including edge cases
Quick Start
Add this to your Cargo.toml
:
[]
= "0.1.0"
Basic Usage
Segment Tree for Range Sum Queries
use ;
// Define a spec for sum operations
;
let values = vec!;
let mut seg_tree = from_vec;
// Query sum of range [1, 4) -> elements at indices 1, 2, 3
assert_eq!; // 2 + 3 + 4
// Update element at index 2 to 10
seg_tree.update;
// Query again - sum should reflect the change
assert_eq!; // 2 + 10 + 4
assert_eq!; // 1 + 2 + 10 + 4 + 5
Using Helper Types
For common operations, you can use the provided helper types:
use ;
let values = vec!;
// Range sum queries
let mut sum_tree = from_vec;
assert_eq!; // 4 + 1 + 5 + 9
// Range minimum queries
let mut min_tree = from_vec;
assert_eq!; // min(4, 1, 5, 9)
// Range maximum queries
let mut max_tree = from_vec;
assert_eq!; // max(4, 1, 5, 9)
Lazy Segment Tree for Range Updates
use ;
// Define a spec for range add + range sum
;
let values = vec!;
let mut lazy_tree = from_vec;
// Initial sum of range [1, 4)
assert_eq!; // 2 + 3 + 4
// Add 10 to all elements in range [1, 4)
lazy_tree.update;
// Query the updated range
assert_eq!; // (2+10) + (3+10) + (4+10)
// Total sum should be updated too
assert_eq!; // 1 + 12 + 13 + 14 + 5
Using Lazy Segment Tree Helpers
use ;
// Range add + range sum
let values = vec!;
let mut tree = from_vec;
tree.update;
assert_eq!; // 1 + (2+5)
assert_eq!; // 7 + 8 + 4 = 19
// Range add + range min
let values = vec!;
let mut min_tree = from_vec;
min_tree.update;
assert_eq!; // min(5, 4, 10, 3, 9, 3)
// Range assignment (replace) + range sum
let values = vec!;
let mut replace_tree = from_vec;
replace_tree.update; // Replace [1, 4) with 10
assert_eq!; // 1 + 10 + 10 + 10 + 5
Advanced Usage
Custom Data Types
You can use segment trees with any type that implements the required traits:
use ;
;
let points = vec!;
let tree = from_vec;
let max_point = tree.query;
assert_eq!;
assert_eq!;
API Reference
SegTree
SegTree::new(size: usize)
— Create empty tree with given size.SegTree::from_vec(values: &[T])
— Build tree from initial values.query(&self, range: impl RangeBounds<usize>) -> T
— Query a range (half-open, e.g.2..5
).update(&mut self, index: usize, value: T)
— Update a single element.
Trait: SegTreeSpec
LazySegTree
LazySegTree::new(size: usize)
— Create empty lazy tree.LazySegTree::from_vec(values: &[T])
— Build from initial values.query(&self, range: impl RangeBounds<usize>) -> T
— Query a range (half-open).update(&mut self, range: impl RangeBounds<usize>, value: U)
— Update a range.
Trait: LazySegTreeSpec
Helper Types
Regular Segment Trees:
SegTreeSum<T>
— Range sum queriesSegTreeMin<T>
— Range minimum queriesSegTreeMax<T>
— Range maximum queries
Lazy Segment Trees:
LazySegTreeAddSum<T>
— Range add updates, range sum queriesLazySegTreeAddMax<T>
— Range add updates, range max queriesLazySegTreeAddMin<T>
— Range add updates, range min queriesLazySegTreeReplaceSum<T>
— Range assignment (replace) updates, range sum queries
Performance
All operations have the following time complexities:
- Construction: O(n) for
from_vec
, O(n) fornew
- Point update (SegTree): O(log n)
- Range query: O(log n)
- Range update (LazySegTree): O(log n)
Space complexity: O(n)
Requirements
- Rust 2021 edition or later
- For numeric types:
num-traits
crate features - For min/max operations:
min_max_traits
crate features
License
This project is licensed under the MIT License. See the LICENSE file for details.