pub struct RangeSumRangeChminChmaxAdd<T> {
min: T,
max: T,
min2: T,
max2: T,
pub sum: T,
size: T,
n_min: T,
n_max: T,
}Fields§
§min: T§max: T§min2: T§max2: T§sum: T§size: T§n_min: T§n_max: TImplementations§
Source§impl<T> RangeSumRangeChminChmaxAdd<T>
impl<T> RangeSumRangeChminChmaxAdd<T>
Sourcepub fn single(key: T, size: T) -> Self
pub fn single(key: T, size: T) -> Self
Examples found in repository?
crates/competitive/src/algebra/lazy_map.rs (line 523)
522 fn single_agg(&key: &Self::Key) -> Self::Agg {
523 Self::single(key, T::one())
524 }
525 fn act_agg(x: &Self::Agg, a: &Self::Act) -> Option<Self::Agg> {
526 Some(if <Self::ActMonoid as Unital>::is_unit(a) {
527 x.clone()
528 } else if x.size.is_zero() {
529 Self::unit()
530 } else if x.min == x.max || a.lb == a.ub || a.lb >= x.max || a.ub <= x.min {
531 Self::single(x.min.max(a.lb).min(a.ub) + a.bias, x.size)
532 } else if x.min2 == x.max {
533 let mut x = x.clone();
534 let min = x.min.max(a.lb) + a.bias;
535 let max = x.max.min(a.ub) + a.bias;
536 x.min = min;
537 x.max2 = min;
538 x.max = max;
539 x.min2 = max;
540 x.sum = min * x.n_min + max * x.n_max;
541 x
542 } else if a.lb < x.min2 && x.max2 < a.ub {
543 let mut x = x.clone();
544 let min = x.min.max(a.lb);
545 let max = x.max.min(a.ub);
546 x.sum = x.sum + (min - x.min) * x.n_min + (max - x.max) * x.n_max + a.bias * x.size;
547 x.min = min + a.bias;
548 x.max = max + a.bias;
549 x.min2 = x.min2 + a.bias;
550 x.max2 = x.max2 + a.bias;
551 x
552 } else {
553 return None;
554 })
555 }More examples
crates/library_checker/src/data_structure/range_chmin_chmax_add_range_sum.rs (line 16)
10pub fn range_chmin_chmax_add_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: [Saturating<i64>; n]);
14 let mut seg = LazySegmentTree::<RangeSumRangeChminChmaxAdd<Saturating<i64>>>::from_vec(
15 a.iter()
16 .map(|&a| RangeSumRangeChminChmaxAdd::single(a, Saturating(1)))
17 .collect(),
18 );
19 for _ in 0..q {
20 match scanner.scan::<usize>() {
21 0 => {
22 scan!(scanner, l, r, b: Saturating<i64>);
23 seg.update(l..r, RangeChminChmaxAdd::chmin(b));
24 }
25 1 => {
26 scan!(scanner, l, r, b: Saturating<i64>);
27 seg.update(l..r, RangeChminChmaxAdd::chmax(b));
28 }
29 2 => {
30 scan!(scanner, l, r, b: Saturating<i64>);
31 seg.update(l..r, RangeChminChmaxAdd::add(b));
32 }
33 3 => {
34 scan!(scanner, l, r);
35 writeln!(writer, "{}", seg.fold(l..r).sum).ok();
36 }
37 _ => unreachable!("unknown query"),
38 }
39 }
40}Trait Implementations§
Source§impl<T: Clone> Clone for RangeSumRangeChminChmaxAdd<T>
impl<T: Clone> Clone for RangeSumRangeChminChmaxAdd<T>
Source§fn clone(&self) -> RangeSumRangeChminChmaxAdd<T>
fn clone(&self) -> RangeSumRangeChminChmaxAdd<T>
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 moreSource§impl<T: Debug> Debug for RangeSumRangeChminChmaxAdd<T>
impl<T: Debug> Debug for RangeSumRangeChminChmaxAdd<T>
Source§impl<T> LazyMapMonoid for RangeSumRangeChminChmaxAdd<T>
impl<T> LazyMapMonoid for RangeSumRangeChminChmaxAdd<T>
type Key = T
type Agg = RangeSumRangeChminChmaxAdd<T>
type Act = RangeChminChmaxAdd<T>
type AggMonoid = RangeSumRangeChminChmaxAdd<T>
type ActMonoid = RangeChminChmaxAdd<T>
type KeyAct = RangeChminChmaxAdd<T>
fn single_agg(key: &Self::Key) -> Self::Agg
fn act_agg(x: &Self::Agg, a: &Self::Act) -> Option<Self::Agg>
fn toggle(_x: &mut Self::Agg)
fn act_key(x: &Self::Key, a: &Self::Act) -> Self::Key
fn agg_unit() -> Self::Agg
fn act_unit() -> Self::Act
fn agg_operate(x: &Self::Agg, y: &Self::Agg) -> Self::Agg
fn act_operate(x: &Self::Act, y: &Self::Act) -> Self::Act
fn agg_operate_assign(x: &mut Self::Agg, y: &Self::Agg)
fn act_operate_assign(x: &mut Self::Act, y: &Self::Act)
Source§impl<T> Magma for RangeSumRangeChminChmaxAdd<T>
impl<T> Magma for RangeSumRangeChminChmaxAdd<T>
Source§impl<T: PartialEq> PartialEq for RangeSumRangeChminChmaxAdd<T>
impl<T: PartialEq> PartialEq for RangeSumRangeChminChmaxAdd<T>
Source§fn eq(&self, other: &RangeSumRangeChminChmaxAdd<T>) -> bool
fn eq(&self, other: &RangeSumRangeChminChmaxAdd<T>) -> bool
Tests for
self and other values to be equal, and is used by ==.Source§impl<T> Unital for RangeSumRangeChminChmaxAdd<T>
impl<T> Unital for RangeSumRangeChminChmaxAdd<T>
impl<T> Associative for RangeSumRangeChminChmaxAdd<T>
impl<T: Eq> Eq for RangeSumRangeChminChmaxAdd<T>
impl<T> StructuralPartialEq for RangeSumRangeChminChmaxAdd<T>
Auto Trait Implementations§
impl<T> Freeze for RangeSumRangeChminChmaxAdd<T>where
T: Freeze,
impl<T> RefUnwindSafe for RangeSumRangeChminChmaxAdd<T>where
T: RefUnwindSafe,
impl<T> Send for RangeSumRangeChminChmaxAdd<T>where
T: Send,
impl<T> Sync for RangeSumRangeChminChmaxAdd<T>where
T: Sync,
impl<T> Unpin for RangeSumRangeChminChmaxAdd<T>where
T: Unpin,
impl<T> UnwindSafe for RangeSumRangeChminChmaxAdd<T>where
T: 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