Skip to main content

WaveletMatrixPointAdd

Struct WaveletMatrixPointAdd 

Source
pub struct WaveletMatrixPointAdd<'a, T, M>
where T: Ord + Clone, M: AbelianGroup,
{ wavelet_matrix: &'a WaveletMatrix<T>, bits: Vec<BinaryIndexedTree<M>>, }

Fields§

§wavelet_matrix: &'a WaveletMatrix<T>§bits: Vec<BinaryIndexedTree<M>>

Implementations§

Source§

impl<'a, T, M> WaveletMatrixPointAdd<'a, T, M>
where T: Ord + Clone, M: AbelianGroup,

Source

pub fn update(&mut self, index: usize, value: M::T)

Examples found in repository?
crates/library_checker/src/data_structure/point_add_rectangle_sum.rs (line 46)
17pub fn point_add_rectangle_sum(reader: impl Read, writer: impl Write) {
18    prepare_io!(reader, writer);
19    sc!(n, q, xyw: [(u32, u32, u64); iter n]);
20    let mut points: Vec<_> = xyw.map(|(x, y, w)| (x, y, w as i64)).collect();
21    sc!(queries: [Query; q]);
22    points.extend(queries.iter().filter_map(|&query| match query {
23        Query::Add { x, y, .. } => Some((x, y, 0)),
24        Query::Sum { .. } => None,
25    }));
26    let mut order: Vec<_> = (0..points.len()).collect();
27    order.radix_sort_by_key(|&i| points[i].0);
28    let mut positions = vec![0; points.len()];
29    let mut xs = Vec::with_capacity(points.len());
30    let mut ys = Vec::with_capacity(points.len());
31    let mut weights = Vec::with_capacity(points.len());
32    for (i, &point) in order.iter().enumerate() {
33        positions[point] = i;
34        let (x, y, w) = points[point];
35        xs.push(x);
36        ys.push(y);
37        weights.push(w);
38    }
39    let wm = WaveletMatrix::new(ys);
40    let mut fold: WaveletMatrixPointAdd<_, AdditiveOperation<i64>> = wm.build_point_add(&weights);
41
42    let mut point = n;
43    for query in queries {
44        match query {
45            Query::Add { w, .. } => {
46                fold.update(positions[point], w as i64);
47                point += 1;
48            }
49            Query::Sum { l, d, r, u } => {
50                let l = xs.partition_point(|&x| x < l);
51                let r = xs.partition_point(|&x| x < r);
52                pp!(fold.fold_range(d..u, l..r));
53            }
54        }
55    }
56}
Source

pub fn fold_lessthan(&self, value: T, range: Range<usize>) -> M::T

Source

pub fn fold_range(&self, values: Range<T>, range: Range<usize>) -> M::T

Examples found in repository?
crates/library_checker/src/data_structure/point_add_rectangle_sum.rs (line 52)
17pub fn point_add_rectangle_sum(reader: impl Read, writer: impl Write) {
18    prepare_io!(reader, writer);
19    sc!(n, q, xyw: [(u32, u32, u64); iter n]);
20    let mut points: Vec<_> = xyw.map(|(x, y, w)| (x, y, w as i64)).collect();
21    sc!(queries: [Query; q]);
22    points.extend(queries.iter().filter_map(|&query| match query {
23        Query::Add { x, y, .. } => Some((x, y, 0)),
24        Query::Sum { .. } => None,
25    }));
26    let mut order: Vec<_> = (0..points.len()).collect();
27    order.radix_sort_by_key(|&i| points[i].0);
28    let mut positions = vec![0; points.len()];
29    let mut xs = Vec::with_capacity(points.len());
30    let mut ys = Vec::with_capacity(points.len());
31    let mut weights = Vec::with_capacity(points.len());
32    for (i, &point) in order.iter().enumerate() {
33        positions[point] = i;
34        let (x, y, w) = points[point];
35        xs.push(x);
36        ys.push(y);
37        weights.push(w);
38    }
39    let wm = WaveletMatrix::new(ys);
40    let mut fold: WaveletMatrixPointAdd<_, AdditiveOperation<i64>> = wm.build_point_add(&weights);
41
42    let mut point = n;
43    for query in queries {
44        match query {
45            Query::Add { w, .. } => {
46                fold.update(positions[point], w as i64);
47                point += 1;
48            }
49            Query::Sum { l, d, r, u } => {
50                let l = xs.partition_point(|&x| x < l);
51                let r = xs.partition_point(|&x| x < r);
52                pp!(fold.fold_range(d..u, l..r));
53            }
54        }
55    }
56}
Source

fn fold_lessthan_index( &self, idx: usize, range: Range<usize>, bits: usize, ) -> M::T

Examples found in repository?
crates/competitive/src/data_structure/wavelet_matrix.rs (line 1542)
1514    pub fn fold_range(&self, values: Range<T>, range: Range<usize>) -> M::T {
1515        let lower = self
1516            .wavelet_matrix
1517            .compress
1518            .index_lower_bound(&values.start);
1519        let upper = self.wavelet_matrix.compress.index_lower_bound(&values.end);
1520        if lower >= upper {
1521            return M::unit();
1522        }
1523        let mut range = range;
1524        for d in (0..self.wavelet_matrix.bit_length).rev() {
1525            let level = self.wavelet_matrix.level(d);
1526            let start1 = self.wavelet_matrix.bit_vectors[level].rank1(range.start);
1527            let end1 = self.wavelet_matrix.bit_vectors[level].rank1(range.end);
1528            let start0 = range.start - start1;
1529            let end0 = range.end - end1;
1530            if ((lower >> d) & 1) == ((upper >> d) & 1) {
1531                if ((lower >> d) & 1) == 0 {
1532                    range = start0..end0;
1533                } else {
1534                    range = self.wavelet_matrix.zeros[level] + start1
1535                        ..self.wavelet_matrix.zeros[level] + end1;
1536                }
1537                continue;
1538            }
1539            let zero_range = start0..end0;
1540            let one_range =
1541                self.wavelet_matrix.zeros[level] + start1..self.wavelet_matrix.zeros[level] + end1;
1542            let lower_sum = self.fold_lessthan_index(lower, zero_range.clone(), d);
1543            let upper_sum = self.fold_lessthan_index(upper, one_range, d);
1544            let zero_sum = self.bits[level].fold_abelian(zero_range.start, zero_range.end);
1545            let mut result = M::rinv_operate(&zero_sum, &lower_sum);
1546            M::operate_assign(&mut result, &upper_sum);
1547            return result;
1548        }
1549        M::unit()
1550    }

Auto Trait Implementations§

§

impl<'a, T, M> Freeze for WaveletMatrixPointAdd<'a, T, M>

§

impl<'a, T, M> RefUnwindSafe for WaveletMatrixPointAdd<'a, T, M>

§

impl<'a, T, M> Send for WaveletMatrixPointAdd<'a, T, M>

§

impl<'a, T, M> Sync for WaveletMatrixPointAdd<'a, T, M>

§

impl<'a, T, M> Unpin for WaveletMatrixPointAdd<'a, T, M>

§

impl<'a, T, M> UnsafeUnpin for WaveletMatrixPointAdd<'a, T, M>

§

impl<'a, T, M> UnwindSafe for WaveletMatrixPointAdd<'a, T, M>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToArrayVecScalar for T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.