dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
pub struct Segtree<T> {
    pub size: usize,
    inf: T,
    pub(crate) node: Vec<T>,
}

impl<T> Segtree<T> {
    fn n(&self) -> usize {
        self.node.len() >> 1
    }
}

impl<T: Ord + Clone> Segtree<T> {
    fn update(
        &mut self,
        i: usize,
    ) {
        self.node[i] =
            self.node[i << 1].clone().min(self.node[i << 1 | 1].clone());
    }

    pub fn new(
        inf: T,
        size: usize,
    ) -> Self {
        assert!(size > 0);

        let node = vec![inf.clone(); size.next_power_of_two() << 1];

        Self { inf, size, node }
    }

    pub fn set(
        &mut self,
        mut i: usize,
        x: T,
    ) {
        assert!(i < self.size);

        i += self.n();

        self.node[i] = x;

        while i > 1 {
            i >>= 1;

            self.update(i);
        }
    }

    pub fn fold(
        &self,
        mut l: usize,
        mut r: usize,
    ) -> T {
        assert!(l <= r && r <= self.size);

        let mut vl = self.inf.clone();

        let mut vr = self.inf.clone();

        let n = self.n();

        l += n;

        r += n;

        while l < r {
            if l & 1 == 1 {
                vl = vl.min(self.node[l].clone());

                l += 1;
            }

            if r & 1 == 1 {
                r -= 1;

                vr = self.node[r].clone().min(vr);
            }

            l >>= 1;

            r >>= 1;
        }

        vl.min(vr)
    }
}

use std::ops::*;

impl<T> Index<usize> for Segtree<T> {
    type Output = T;

    fn index(
        &self,
        i: usize,
    ) -> &Self::Output {
        &self.node[i + self.n()]
    }
}

#[cfg(test)]

mod tests {

    #[test]

    fn test() {}
}