pub struct CompressedSegmentTree<M, X, Inner>where
M: Monoid,{
compress: Vec<X>,
segs: Vec<Inner>,
_marker: PhantomData<fn() -> M>,
}Fields§
§compress: Vec<X>§segs: Vec<Inner>§_marker: PhantomData<fn() -> M>Implementations§
Source§impl<M, T1> CompressedSegmentTree<M, T1, Tag<M>>
impl<M, T1> CompressedSegmentTree<M, T1, Tag<M>>
Source§impl<M, T1, T2> CompressedSegmentTree<M, T1, CompressedSegmentTree<M, T2, Tag<M>>>
impl<M, T1, T2> CompressedSegmentTree<M, T1, CompressedSegmentTree<M, T2, Tag<M>>>
Sourcepub fn new(points: &[(T1, (T2,))]) -> Self
pub fn new(points: &[(T1, (T2,))]) -> Self
Examples found in repository?
crates/library_checker/src/data_structure/point_add_rectangle_sum.rs (line 30)
14pub fn point_add_rectangle_sum(reader: impl Read, mut writer: impl Write) {
15 let s = read_all_unchecked(reader);
16 let mut scanner = Scanner::new(&s);
17 scan!(scanner, n, q, xyw: [(u32, u32, u64); n], queries: [Query; q]);
18 let points: Vec<_> = xyw
19 .iter()
20 .map(|&(x, y, _)| (x, (y,)))
21 .chain(queries.iter().filter_map(|&query| {
22 if let Query::Add { x, y, .. } = query {
23 Some((x, (y,)))
24 } else {
25 None
26 }
27 }))
28 .collect();
29
30 let mut seg = CompressedSegmentTree2d::<AdditiveOperation<u64>, _, _>::new(&points);
31 for &(x, y, w) in &xyw {
32 seg.update(&(x, (y,)), &w);
33 }
34
35 for query in queries {
36 match query {
37 Query::Add { x, y, w } => {
38 seg.update(&(x, (y,)), &w);
39 }
40 Query::Sum { l, d, r, u } => {
41 let ans = seg.fold(&(l..r, (d..u,)));
42 writeln!(writer, "{}", ans).ok();
43 }
44 }
45 }
46}fn from_iter<'a, Iter>(points: Iter) -> Self
Sourcepub fn fold<Q1, Q2>(&self, range: &(Q1, (Q2,))) -> M::Twhere
Q1: RangeBounds<T1>,
Q2: RangeBounds<T2>,
pub fn fold<Q1, Q2>(&self, range: &(Q1, (Q2,))) -> M::Twhere
Q1: RangeBounds<T1>,
Q2: RangeBounds<T2>,
Examples found in repository?
crates/library_checker/src/data_structure/point_add_rectangle_sum.rs (line 41)
14pub fn point_add_rectangle_sum(reader: impl Read, mut writer: impl Write) {
15 let s = read_all_unchecked(reader);
16 let mut scanner = Scanner::new(&s);
17 scan!(scanner, n, q, xyw: [(u32, u32, u64); n], queries: [Query; q]);
18 let points: Vec<_> = xyw
19 .iter()
20 .map(|&(x, y, _)| (x, (y,)))
21 .chain(queries.iter().filter_map(|&query| {
22 if let Query::Add { x, y, .. } = query {
23 Some((x, (y,)))
24 } else {
25 None
26 }
27 }))
28 .collect();
29
30 let mut seg = CompressedSegmentTree2d::<AdditiveOperation<u64>, _, _>::new(&points);
31 for &(x, y, w) in &xyw {
32 seg.update(&(x, (y,)), &w);
33 }
34
35 for query in queries {
36 match query {
37 Query::Add { x, y, w } => {
38 seg.update(&(x, (y,)), &w);
39 }
40 Query::Sum { l, d, r, u } => {
41 let ans = seg.fold(&(l..r, (d..u,)));
42 writeln!(writer, "{}", ans).ok();
43 }
44 }
45 }
46}Sourcepub fn update(&mut self, key: &(T1, (T2,)), x: &M::T)
pub fn update(&mut self, key: &(T1, (T2,)), x: &M::T)
Examples found in repository?
crates/library_checker/src/data_structure/point_add_rectangle_sum.rs (line 32)
14pub fn point_add_rectangle_sum(reader: impl Read, mut writer: impl Write) {
15 let s = read_all_unchecked(reader);
16 let mut scanner = Scanner::new(&s);
17 scan!(scanner, n, q, xyw: [(u32, u32, u64); n], queries: [Query; q]);
18 let points: Vec<_> = xyw
19 .iter()
20 .map(|&(x, y, _)| (x, (y,)))
21 .chain(queries.iter().filter_map(|&query| {
22 if let Query::Add { x, y, .. } = query {
23 Some((x, (y,)))
24 } else {
25 None
26 }
27 }))
28 .collect();
29
30 let mut seg = CompressedSegmentTree2d::<AdditiveOperation<u64>, _, _>::new(&points);
31 for &(x, y, w) in &xyw {
32 seg.update(&(x, (y,)), &w);
33 }
34
35 for query in queries {
36 match query {
37 Query::Add { x, y, w } => {
38 seg.update(&(x, (y,)), &w);
39 }
40 Query::Sum { l, d, r, u } => {
41 let ans = seg.fold(&(l..r, (d..u,)));
42 writeln!(writer, "{}", ans).ok();
43 }
44 }
45 }
46}Source§impl<M, T1, T2, T3> CompressedSegmentTree<M, T1, CompressedSegmentTree<M, T2, CompressedSegmentTree<M, T3, Tag<M>>>>
impl<M, T1, T2, T3> CompressedSegmentTree<M, T1, CompressedSegmentTree<M, T2, CompressedSegmentTree<M, T3, Tag<M>>>>
Source§impl<M, T1, T2, T3, T4> CompressedSegmentTree<M, T1, CompressedSegmentTree<M, T2, CompressedSegmentTree<M, T3, CompressedSegmentTree<M, T4, Tag<M>>>>>
impl<M, T1, T2, T3, T4> CompressedSegmentTree<M, T1, CompressedSegmentTree<M, T2, CompressedSegmentTree<M, T3, CompressedSegmentTree<M, T4, Tag<M>>>>>
pub fn new(points: &[(T1, (T2, (T3, (T4,))))]) -> Self
fn from_iter<'a, Iter>(points: Iter) -> Selfwhere
T1: 'a,
T2: 'a,
T3: 'a,
T4: 'a,
Iter: IntoIterator<Item = &'a (T1, (T2, (T3, (T4,))))> + Clone,
pub fn fold<Q1, Q2, Q3, Q4>(&self, range: &(Q1, (Q2, (Q3, (Q4,))))) -> M::T
pub fn update(&mut self, key: &(T1, (T2, (T3, (T4,)))), x: &M::T)
Trait Implementations§
Source§impl<M, X, Inner> Clone for CompressedSegmentTree<M, X, Inner>
impl<M, X, Inner> Clone for CompressedSegmentTree<M, X, Inner>
Source§impl<M, X, Inner> Debug for CompressedSegmentTree<M, X, Inner>
impl<M, X, Inner> Debug for CompressedSegmentTree<M, X, Inner>
Auto Trait Implementations§
impl<M, X, Inner> Freeze for CompressedSegmentTree<M, X, Inner>
impl<M, X, Inner> RefUnwindSafe for CompressedSegmentTree<M, X, Inner>where
X: RefUnwindSafe,
Inner: RefUnwindSafe,
impl<M, X, Inner> Send for CompressedSegmentTree<M, X, Inner>
impl<M, X, Inner> Sync for CompressedSegmentTree<M, X, Inner>
impl<M, X, Inner> Unpin for CompressedSegmentTree<M, X, Inner>
impl<M, X, Inner> UnsafeUnpin for CompressedSegmentTree<M, X, Inner>
impl<M, X, Inner> UnwindSafe for CompressedSegmentTree<M, X, Inner>where
X: UnwindSafe,
Inner: UnwindSafe,
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