use crate::{SegTree, SegTreeSpec};
use min_max_traits::Max as ConstUpperBound;
use std::marker::PhantomData;
pub struct SegTreeMinSpec<T>(PhantomData<T>);
impl<T> SegTreeSpec for SegTreeMinSpec<T>
where
T: Clone + ConstUpperBound + Ord,
{
type T = T;
const ID: Self::T = <T as ConstUpperBound>::MAX;
fn op(a: &mut Self::T, b: &Self::T) {
if *a > *b {
*a = b.clone();
}
}
}
pub type SegTreeMin<T> = SegTree<SegTreeMinSpec<T>>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_min_basic_operations() {
let values = vec![5, 2, 8, 1, 9, 3];
let tree = SegTreeMin::<i32>::from_slice(&values);
assert_eq!(tree.query(..), 1); assert_eq!(tree.query(1..4), 1); assert_eq!(tree.query(..1), 5); assert_eq!(tree.query(4..6), 3); assert_eq!(tree.query(2..2), i32::MAX); }
#[test]
fn test_min_updates() {
let values = vec![10, 20, 30, 40, 50];
let mut tree = SegTreeMin::<i32>::from_slice(&values);
assert_eq!(tree.query(..), 10);
tree.update(0, 100);
assert_eq!(tree.query(..), 20); assert_eq!(tree.query(..1), 100); assert_eq!(tree.query(1..), 20);
tree.update(2, 5);
assert_eq!(tree.query(..), 5); assert_eq!(tree.query(2..3), 5); assert_eq!(tree.query(..3), 5); }
#[test]
fn test_min_with_different_types() {
let values_i64 = vec![1000000000_i64, 500000000, 2000000000];
let tree_i64 = SegTreeMin::<i64>::from_slice(&values_i64);
assert_eq!(tree_i64.query(..), 500000000);
let values_u32 = vec![15u32, 25, 5, 45];
let tree_u32 = SegTreeMin::<u32>::from_slice(&values_u32);
assert_eq!(tree_u32.query(..), 5);
assert_eq!(tree_u32.query(1..3), 5);
}
#[test]
fn test_min_edge_cases() {
let single = vec![42];
let tree_single = SegTreeMin::<i32>::from_slice(&single);
assert_eq!(tree_single.query(..), 42);
assert_eq!(tree_single.query(..0), i32::MAX);
let same = vec![7, 7, 7, 7, 7];
let tree_same = SegTreeMin::<i32>::from_slice(&same);
assert_eq!(tree_same.query(..), 7);
assert_eq!(tree_same.query(1..4), 7);
assert_eq!(tree_same.query(2..3), 7);
let values = vec![1, 2, 3, 4, 5, 6, 7, 8];
let tree = SegTreeMin::<i32>::from_slice(&values);
assert_eq!(tree.query(3..3), i32::MAX); assert_eq!(tree.query(..0), i32::MAX); assert_eq!(tree.query(8..), i32::MAX); }
#[test]
fn test_min_large_tree() {
let size: i32 = 1000;
let values: Vec<i32> = (1..=size).collect();
let mut tree = SegTreeMin::<i32>::from_slice(&values);
assert_eq!(tree.query(..), 1);
assert_eq!(tree.query(..500), 1);
assert_eq!(tree.query(500..), 501);
tree.update(0, 2000); assert_eq!(tree.query(..), 2); assert_eq!(tree.query(..500), 2); assert_eq!(tree.query(..1), 2000); }
#[test]
fn test_min_negative_values() {
let values = vec![-5, -3, -1, 2, 4];
let mut tree = SegTreeMin::<i32>::from_slice(&values);
assert_eq!(tree.query(..), -5); assert_eq!(tree.query(..3), -5); assert_eq!(tree.query(3..5), 2); assert_eq!(tree.query(1..4), -3);
tree.update(0, -10); assert_eq!(tree.query(..), -10); assert_eq!(tree.query(1..), -3); }
#[test]
fn test_min_new_empty_tree() {
let mut tree = SegTreeMin::<i32>::new(5);
assert_eq!(tree.query(..), i32::MAX);
assert_eq!(tree.query(2..4), i32::MAX);
tree.update(1, 10);
tree.update(3, 20);
assert_eq!(tree.query(..), 10); assert_eq!(tree.query(1..4), 10); assert_eq!(tree.query(3..5), 20); assert_eq!(tree.query(..1), i32::MAX); }
#[test]
fn test_min_extremes() {
let values = vec![i32::MIN, i32::MAX, 0, -1, 1];
let mut tree = SegTreeMin::<i32>::from_slice(&values);
assert_eq!(tree.query(..), i32::MIN); assert_eq!(tree.query(1..), -1); assert_eq!(tree.query(1..2), i32::MAX);
tree.update(0, 0); assert_eq!(tree.query(..), -1); }
#[test]
fn test_consume_vec_constructor() {
let values = vec![3, 1, 4, 1, 5];
let tree = SegTreeMin::<i32>::from_vec(values); assert_eq!(tree.query(..), 1);
}
}