pub struct WaveletMatrixFold<'a, T, M>{
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>
impl<'a, T, M> WaveletMatrixFold<'a, T, M>
Sourcefn range_sum(&self, level: usize, range: Range<usize>) -> M::T
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 }Sourcepub fn fold_lessthan(&self, val: T, range: Range<usize>) -> M::T
pub fn fold_lessthan(&self, val: T, range: Range<usize>) -> M::T
Sourcepub fn fold_lessthan_with_count(
&self,
val: T,
range: Range<usize>,
) -> (usize, M::T)
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
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}pub fn fold_range(&self, valrange: Range<T>, range: Range<usize>) -> M::T
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>
impl<'a, T, M> Clone for WaveletMatrixFold<'a, T, M>
Source§fn clone(&self) -> WaveletMatrixFold<'a, T, M>
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)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreAuto Trait Implementations§
impl<'a, T, M> Freeze for WaveletMatrixFold<'a, T, M>
impl<'a, T, M> RefUnwindSafe for WaveletMatrixFold<'a, T, M>
impl<'a, T, M> Send for WaveletMatrixFold<'a, T, M>
impl<'a, T, M> Sync for WaveletMatrixFold<'a, T, M>
impl<'a, T, M> Unpin for WaveletMatrixFold<'a, T, M>
impl<'a, T, M> UnsafeUnpin for WaveletMatrixFold<'a, T, M>
impl<'a, T, M> UnwindSafe for WaveletMatrixFold<'a, T, M>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more