pub struct LazySegmentTree<M>where
M: MonoidAction,{ /* private fields */ }
Implementations§
Source§impl<M> LazySegmentTree<M>where
M: MonoidAction,
impl<M> LazySegmentTree<M>where
M: MonoidAction,
Sourcepub fn new(n: usize) -> Self
pub fn new(n: usize) -> Self
Examples found in repository?
crates/aizu_online_judge/src/dsl/dsl_2_d.rs (line 10)
6pub fn dsl_2_d(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeUpdate<_>>::new(n);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i32);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, i);
19 writeln!(writer, "{}", seg.fold(i..i + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
More examples
crates/aizu_online_judge/src/dsl/dsl_2_f.rs (line 10)
6pub fn dsl_2_f(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeUpdate<_>>::new(n);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i32);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
Sourcepub fn from_vec(v: Vec<M::Agg>) -> Self
pub fn from_vec(v: Vec<M::Agg>) -> Self
Examples found in repository?
crates/aizu_online_judge/src/dsl/dsl_2_h.rs (line 10)
6pub fn dsl_2_h(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeAdd<_>>::from_vec(vec![0; n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i64);
15 seg.update(s..t + 1, x);
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
More examples
crates/aizu_online_judge/src/dsl/dsl_2_e.rs (line 10)
6pub fn dsl_2_e(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeAdd<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: u64);
15 seg.update(s - 1..t, x);
16 }
17 1 => {
18 scan!(scanner, i);
19 writeln!(writer, "{}", seg.fold(i - 1..i).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_g.rs (line 10)
6pub fn dsl_2_g(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeAdd<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: u64);
15 seg.update(s - 1..t, x);
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s - 1..t).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_i.rs (line 10)
6pub fn dsl_2_i(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeUpdate<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i64);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/library_checker/src/datastructure/range_affine_range_sum.rs (lines 14-16)
10pub fn range_affine_range_sum(reader: impl Read, mut writer: impl Write) {
11 let s = read_all_unchecked(reader);
12 let mut scanner = Scanner::new(&s);
13 scan!(scanner, n, q, a: [MInt998244353]);
14 let mut seg = LazySegmentTree::<RangeSumRangeLinear<_>>::from_vec(
15 a.take(n).map(|x| (x, MInt998244353::one())).collect::<_>(),
16 );
17 for _ in 0..q {
18 match scanner.scan::<usize>() {
19 0 => {
20 scan!(scanner, l, r, bc: (MInt998244353, MInt998244353));
21 seg.update(l..r, bc);
22 }
23 1 => {
24 scan!(scanner, l, r);
25 writeln!(writer, "{}", seg.fold(l..r).0).ok();
26 }
27 _ => panic!("unknown query"),
28 }
29 }
30}
crates/aizu_online_judge/src/grl/grl_5_e.rs (line 24)
12pub fn grl_5_e(reader: impl Read, mut writer: impl Write) {
13 let s = read_all_unchecked(reader);
14 let mut scanner = Scanner::new(&s);
15 scan!(scanner, n, c: [SizedCollect<usize>]);
16 let edges = c
17 .take(n)
18 .enumerate()
19 .flat_map(|(u, it)| it.into_iter().map(move |v| (u, v)))
20 .collect();
21 let mut graph = UndirectedSparseGraph::from_edges(n, edges);
22 let hld = HeavyLightDecomposition::new(0, &mut graph);
23 type M = (AdditiveOperation<u64>, AdditiveOperation<u64>);
24 let mut seg = LazySegmentTree::<RangeSumRangeAdd<_>>::from_vec(vec![(0u64, 1u64); n]);
25
26 scan!(scanner, q);
27 for _ in 0..q {
28 match scanner.scan::<usize>() {
29 0 => {
30 scan!(scanner, v, w: u64);
31 hld.update(0, v, true, |l, r| seg.update(l..r, w));
32 }
33 1 => {
34 scan!(scanner, u);
35 let ans = hld.query::<M, _>(0, u, true, |l, r| seg.fold(l..r)).0;
36 writeln!(writer, "{}", ans).ok();
37 }
38 _ => panic!("unknown query"),
39 }
40 }
41}
Additional examples can be found in:
pub fn from_keys(keys: impl ExactSizeIterator<Item = M::Key>) -> Self
Sourcepub fn update<R>(&mut self, range: R, x: M::Act)where
R: RangeBounds<usize>,
pub fn update<R>(&mut self, range: R, x: M::Act)where
R: RangeBounds<usize>,
Examples found in repository?
crates/aizu_online_judge/src/dsl/dsl_2_d.rs (line 15)
6pub fn dsl_2_d(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeUpdate<_>>::new(n);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i32);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, i);
19 writeln!(writer, "{}", seg.fold(i..i + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
More examples
crates/aizu_online_judge/src/dsl/dsl_2_f.rs (line 15)
6pub fn dsl_2_f(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeUpdate<_>>::new(n);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i32);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_h.rs (line 15)
6pub fn dsl_2_h(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeAdd<_>>::from_vec(vec![0; n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i64);
15 seg.update(s..t + 1, x);
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_e.rs (line 15)
6pub fn dsl_2_e(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeAdd<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: u64);
15 seg.update(s - 1..t, x);
16 }
17 1 => {
18 scan!(scanner, i);
19 writeln!(writer, "{}", seg.fold(i - 1..i).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_g.rs (line 15)
6pub fn dsl_2_g(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeAdd<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: u64);
15 seg.update(s - 1..t, x);
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s - 1..t).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_i.rs (line 15)
6pub fn dsl_2_i(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeUpdate<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i64);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
Sourcepub fn fold<R>(&mut self, range: R) -> M::Aggwhere
R: RangeBounds<usize>,
pub fn fold<R>(&mut self, range: R) -> M::Aggwhere
R: RangeBounds<usize>,
Examples found in repository?
More examples
crates/aizu_online_judge/src/dsl/dsl_2_d.rs (line 19)
6pub fn dsl_2_d(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeUpdate<_>>::new(n);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i32);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, i);
19 writeln!(writer, "{}", seg.fold(i..i + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_f.rs (line 19)
6pub fn dsl_2_f(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeUpdate<_>>::new(n);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i32);
15 seg.update(s..t + 1, Some(x));
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_h.rs (line 19)
6pub fn dsl_2_h(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);
10 let mut seg = LazySegmentTree::<RangeMinRangeAdd<_>>::from_vec(vec![0; n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: i64);
15 seg.update(s..t + 1, x);
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s..t + 1)).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_e.rs (line 19)
6pub fn dsl_2_e(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeAdd<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: u64);
15 seg.update(s - 1..t, x);
16 }
17 1 => {
18 scan!(scanner, i);
19 writeln!(writer, "{}", seg.fold(i - 1..i).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
crates/aizu_online_judge/src/dsl/dsl_2_g.rs (line 19)
6pub fn dsl_2_g(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);
10 let mut seg = LazySegmentTree::<RangeSumRangeAdd<_>>::from_vec(vec![(0, 1); n]);
11 for _ in 0..q {
12 match scanner.scan::<usize>() {
13 0 => {
14 scan!(scanner, s, t, x: u64);
15 seg.update(s - 1..t, x);
16 }
17 1 => {
18 scan!(scanner, s, t);
19 writeln!(writer, "{}", seg.fold(s - 1..t).0).ok();
20 }
21 _ => panic!("unknown query"),
22 }
23 }
24}
pub fn set(&mut self, k: usize, x: M::Agg)
pub fn get(&mut self, k: usize) -> M::Agg
pub fn fold_all(&mut self) -> M::Agg
Sourcepub fn position_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
pub fn position_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
Returns the first index that satisfies a accumlative predicate.
Sourcepub fn rposition_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
pub fn rposition_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
Returns the last index that satisfies a accumlative predicate.
Trait Implementations§
Source§impl<M> Clone for LazySegmentTree<M>where
M: MonoidAction,
impl<M> Clone for LazySegmentTree<M>where
M: MonoidAction,
Auto Trait Implementations§
impl<M> Freeze for LazySegmentTree<M>
impl<M> RefUnwindSafe for LazySegmentTree<M>
impl<M> Send for LazySegmentTree<M>
impl<M> Sync for LazySegmentTree<M>
impl<M> Unpin for LazySegmentTree<M>
impl<M> UnwindSafe for LazySegmentTree<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