dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
pub struct Fenwick(Vec<i32>);

impl Fenwick {
    pub fn new(size: usize) -> Self {
        Self(vec![0; size])
    }

    pub fn size(&self) -> usize {
        self.0.len()
    }

    pub fn add(
        &mut self,
        mut i: usize,
        x: i32,
    ) {
        let n = self.size();

        assert!(i < n);

        while i < n {
            self.0[i] += x;

            i += i + 1;
        }
    }

    pub fn sum_le(
        &self,
        mut i: usize,
    ) -> i32 {
        assert!(i < self.size());

        let mut v = 0;

        loop {
            v += self.0[i];

            i = i & (i + 1);

            if i == 0 {
                return v;
            }

            i -= 1;
        }
    }
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        let mut fw = Fenwick::new(10);

        fw.add(5, 1);

        assert_eq!(fw.sum_le(4), 0);

        assert_eq!(fw.sum_le(5), 1);
    }
}