Skip to main content

WaveletMatrixFold

Struct WaveletMatrixFold 

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

Fields§

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

Implementations§

Source§

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

Source

fn range_sum(&self, level: usize, range: Range<usize>) -> M::T

Examples found in repository?
crates/competitive/src/data_structure/wavelet_matrix.rs (line 360)
349    pub fn fold_lessthan_with_count(&self, val: T, mut range: Range<usize>) -> (usize, M::T) {
350        debug_assert!(range.end <= self.wavelet_matrix.len);
351        let idx = self.wavelet_matrix.compress.index_lower_bound(&val);
352        let mut count = 0;
353        let mut sum = M::unit();
354        for d in (0..self.wavelet_matrix.bit_length).rev() {
355            let level = self.wavelet_matrix.level(d);
356            let start0 = self.wavelet_matrix.rank0(level, range.start);
357            let end0 = self.wavelet_matrix.rank0(level, range.end);
358            if ((idx >> d) & 1) != 0 {
359                count += end0 - start0;
360                sum = M::operate(&sum, &self.range_sum(level + 1, start0..end0));
361                range.start = self.wavelet_matrix.zeros[level] + (range.start - start0);
362                range.end = self.wavelet_matrix.zeros[level] + (range.end - end0);
363            } else {
364                range.start = start0;
365                range.end = end0;
366            }
367        }
368        (count, sum)
369    }
Source

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

Examples found in repository?
crates/competitive/src/data_structure/wavelet_matrix.rs (line 373)
371    pub fn fold_range(&self, valrange: Range<T>, range: Range<usize>) -> M::T {
372        M::rinv_operate(
373            &self.fold_lessthan(valrange.end, range.clone()),
374            &self.fold_lessthan(valrange.start, range),
375        )
376    }
Source

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

Examples found in repository?
crates/competitive/src/data_structure/wavelet_matrix.rs (line 346)
345    pub fn fold_lessthan(&self, val: T, range: Range<usize>) -> M::T {
346        self.fold_lessthan_with_count(val, range).1
347    }
348
349    pub fn fold_lessthan_with_count(&self, val: T, mut range: Range<usize>) -> (usize, M::T) {
350        debug_assert!(range.end <= self.wavelet_matrix.len);
351        let idx = self.wavelet_matrix.compress.index_lower_bound(&val);
352        let mut count = 0;
353        let mut sum = M::unit();
354        for d in (0..self.wavelet_matrix.bit_length).rev() {
355            let level = self.wavelet_matrix.level(d);
356            let start0 = self.wavelet_matrix.rank0(level, range.start);
357            let end0 = self.wavelet_matrix.rank0(level, range.end);
358            if ((idx >> d) & 1) != 0 {
359                count += end0 - start0;
360                sum = M::operate(&sum, &self.range_sum(level + 1, start0..end0));
361                range.start = self.wavelet_matrix.zeros[level] + (range.start - start0);
362                range.end = self.wavelet_matrix.zeros[level] + (range.end - end0);
363            } else {
364                range.start = start0;
365                range.end = end0;
366            }
367        }
368        (count, sum)
369    }
370
371    pub fn fold_range(&self, valrange: Range<T>, range: Range<usize>) -> M::T {
372        M::rinv_operate(
373            &self.fold_lessthan(valrange.end, range.clone()),
374            &self.fold_lessthan(valrange.start, range),
375        )
376    }
377
378    pub fn fold_range_with_count(&self, valrange: Range<T>, range: Range<usize>) -> (usize, M::T) {
379        let (count_upper, sum_upper) = self.fold_lessthan_with_count(valrange.end, range.clone());
380        let (count_lower, sum_lower) = self.fold_lessthan_with_count(valrange.start, range);
381        (
382            count_upper - count_lower,
383            M::rinv_operate(&sum_upper, &sum_lower),
384        )
385    }
More examples
Hide additional examples
crates/library_checker/src/data_structure/static_range_sum_with_upper_bound.rs (line 15)
6pub fn static_range_sum_with_upper_bound(reader: impl Read, mut writer: impl Write) {
7    let s = read_all_unchecked(reader);
8    let mut scanner = Scanner::new(&s);
9    scan!(scanner, n, q, a: [i64; n]);
10    let weights = a.clone();
11    let wm = WaveletMatrix::new(a);
12    let fold = wm.build_fold::<AdditiveOperation<i64>>(&weights);
13    for _ in 0..q {
14        scan!(scanner, l, r, x: i64);
15        let (count, sum) = fold.fold_lessthan_with_count(x + 1, l..r);
16        writeln!(writer, "{} {}", count, sum).ok();
17    }
18}
Source

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

Source

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

Trait Implementations§

Source§

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

Source§

fn clone(&self) -> WaveletMatrixFold<'a, T, M>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a, T, M> Debug for WaveletMatrixFold<'a, T, M>
where T: Ord + Clone + Debug, M: AbelianGroup + Debug, M::T: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

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

§

impl<'a, T, M> RefUnwindSafe for WaveletMatrixFold<'a, T, M>
where <M as Magma>::T: RefUnwindSafe, T: RefUnwindSafe,

§

impl<'a, T, M> Send for WaveletMatrixFold<'a, T, M>
where <M as Magma>::T: Send, T: Sync,

§

impl<'a, T, M> Sync for WaveletMatrixFold<'a, T, M>
where <M as Magma>::T: Sync, T: Sync,

§

impl<'a, T, M> Unpin for WaveletMatrixFold<'a, T, M>
where <M as Magma>::T: Unpin,

§

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

§

impl<'a, T, M> UnwindSafe for WaveletMatrixFold<'a, T, M>
where <M as Magma>::T: UnwindSafe, T: RefUnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.