pub struct WaveletMatrixPointAdd<'a, T, M>{
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>
impl<'a, T, M> WaveletMatrixPointAdd<'a, T, M>
Sourcepub fn update(&mut self, index: usize, value: M::T)
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}pub fn fold_lessthan(&self, value: T, range: Range<usize>) -> M::T
Sourcepub fn fold_range(&self, values: Range<T>, range: Range<usize>) -> M::T
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}Sourcefn fold_lessthan_index(
&self,
idx: usize,
range: Range<usize>,
bits: usize,
) -> M::T
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> 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