Trait MonoidAction

Source
pub trait MonoidAction {
    type Key;
    type Agg: Clone;
    type Act: Clone;
    type AggMonoid: Monoid<T = Self::Agg>;
    type ActMonoid: Monoid<T = Self::Act>;

    // Required methods
    fn single_agg(key: &Self::Key) -> Self::Agg;
    fn act_key(x: &Self::Key, a: &Self::Act) -> Self::Key;
    fn act_agg(x: &Self::Agg, a: &Self::Act) -> Option<Self::Agg>;

    // Provided methods
    fn toggle(_x: &mut Self::Agg) { ... }
    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) { ... }
}

Required Associated Types§

Source

type Key

Source

type Agg: Clone

Source

type Act: Clone

Source

type AggMonoid: Monoid<T = Self::Agg>

Source

type ActMonoid: Monoid<T = Self::Act>

Required Methods§

Source

fn single_agg(key: &Self::Key) -> Self::Agg

Source

fn act_key(x: &Self::Key, a: &Self::Act) -> Self::Key

Source

fn act_agg(x: &Self::Agg, a: &Self::Act) -> Option<Self::Agg>

Provided Methods§

Source

fn toggle(_x: &mut Self::Agg)

Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 61)
59    pub fn reverse(node: NodeRef<marker::DataMut<'_>, Self>) {
60        node.reverse();
61        T::toggle(&mut node.data_mut().agg);
62        node.data_mut().rev ^= true;
63    }
Source

fn agg_unit() -> Self::Agg

Examples found in repository?
crates/competitive/src/data_structure/lazy_segment_tree.rs (line 47)
46    pub fn new(n: usize) -> Self {
47        let seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
48        Self { n, seg }
49    }
50    pub fn from_vec(v: Vec<M::Agg>) -> Self {
51        let n = v.len();
52        let mut seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
53        for (i, x) in v.into_iter().enumerate() {
54            seg[i + n].0 = x;
55        }
56        for i in (1..n).rev() {
57            seg[i].0 = M::agg_operate(&seg[2 * i].0, &seg[2 * i + 1].0);
58        }
59        Self { n, seg }
60    }
61    pub fn from_keys(keys: impl ExactSizeIterator<Item = M::Key>) -> Self {
62        let n = keys.len();
63        let mut seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
64        for (i, key) in keys.enumerate() {
65            seg[i + n].0 = M::single_agg(&key);
66        }
67        for i in (1..n).rev() {
68            seg[i].0 = M::agg_operate(&seg[2 * i].0, &seg[2 * i + 1].0);
69        }
70        Self { n, seg }
71    }
72    #[inline]
73    fn update_at(&mut self, k: usize, x: &M::Act) {
74        let nx = M::act_agg(&self.seg[k].0, x);
75        if k < self.n {
76            self.seg[k].1 = M::act_operate(&self.seg[k].1, x);
77        }
78        if let Some(nx) = nx {
79            self.seg[k].0 = nx;
80        } else if k < self.n {
81            self.propagate_at(k);
82            self.recalc_at(k);
83        } else {
84            panic!("act failed on leaf");
85        }
86    }
87    #[inline]
88    fn recalc_at(&mut self, k: usize) {
89        self.seg[k].0 = M::agg_operate(&self.seg[2 * k].0, &self.seg[2 * k + 1].0);
90    }
91    #[inline]
92    fn propagate_at(&mut self, k: usize) {
93        debug_assert!(k < self.n);
94        let x = replace(&mut self.seg[k].1, M::act_unit());
95        self.update_at(2 * k, &x);
96        self.update_at(2 * k + 1, &x);
97    }
98    #[inline]
99    fn propagate(&mut self, k: usize, right: bool, nofilt: bool) {
100        let right = right as usize;
101        for i in (1..(k + 1 - right).next_power_of_two().trailing_zeros()).rev() {
102            if nofilt || (k >> i) << i != k {
103                self.propagate_at((k - right) >> i);
104            }
105        }
106    }
107    #[inline]
108    fn recalc(&mut self, k: usize, right: bool, nofilt: bool) {
109        let right = right as usize;
110        for i in 1..(k + 1 - right).next_power_of_two().trailing_zeros() {
111            if nofilt || (k >> i) << i != k {
112                self.recalc_at((k - right) >> i);
113            }
114        }
115    }
116    pub fn update<R>(&mut self, range: R, x: M::Act)
117    where
118        R: RangeBounds<usize>,
119    {
120        let range = range.to_range_bounded(0, self.n).expect("invalid range");
121        let mut a = range.start + self.n;
122        let mut b = range.end + self.n;
123        self.propagate(a, false, false);
124        self.propagate(b, true, false);
125        while a < b {
126            if a & 1 != 0 {
127                self.update_at(a, &x);
128                a += 1;
129            }
130            if b & 1 != 0 {
131                b -= 1;
132                self.update_at(b, &x);
133            }
134            a /= 2;
135            b /= 2;
136        }
137        self.recalc(range.start + self.n, false, false);
138        self.recalc(range.end + self.n, true, false);
139    }
140    pub fn fold<R>(&mut self, range: R) -> M::Agg
141    where
142        R: RangeBounds<usize>,
143    {
144        let range = range.to_range_bounded(0, self.n).expect("invalid range");
145        let mut l = range.start + self.n;
146        let mut r = range.end + self.n;
147        self.propagate(l, false, true);
148        self.propagate(r, true, true);
149        let mut vl = M::agg_unit();
150        let mut vr = M::agg_unit();
151        while l < r {
152            if l & 1 != 0 {
153                vl = M::agg_operate(&vl, &self.seg[l].0);
154                l += 1;
155            }
156            if r & 1 != 0 {
157                r -= 1;
158                vr = M::agg_operate(&self.seg[r].0, &vr);
159            }
160            l /= 2;
161            r /= 2;
162        }
163        M::agg_operate(&vl, &vr)
164    }
165    pub fn set(&mut self, k: usize, x: M::Agg) {
166        let k = k + self.n;
167        self.propagate(k, false, true);
168        self.seg[k] = (x, M::act_unit());
169        self.recalc(k, false, true);
170    }
171    pub fn get(&mut self, k: usize) -> M::Agg {
172        self.fold(k..k + 1)
173    }
174    pub fn fold_all(&mut self) -> M::Agg {
175        self.fold(0..self.n)
176    }
177    fn bisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
178    where
179        P: Fn(&M::Agg) -> bool,
180    {
181        while pos < self.n {
182            self.propagate_at(pos);
183            pos <<= 1;
184            let nacc = M::agg_operate(&acc, &self.seg[pos].0);
185            if !p(&nacc) {
186                acc = nacc;
187                pos += 1;
188            }
189        }
190        (pos - self.n, acc)
191    }
192    fn rbisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
193    where
194        P: Fn(&M::Agg) -> bool,
195    {
196        while pos < self.n {
197            self.propagate_at(pos);
198            pos = pos * 2 + 1;
199            let nacc = M::agg_operate(&self.seg[pos].0, &acc);
200            if !p(&nacc) {
201                acc = nacc;
202                pos -= 1;
203            }
204        }
205        (pos - self.n, acc)
206    }
207    /// Returns the first index that satisfies a accumlative predicate.
208    pub fn position_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
209    where
210        R: RangeBounds<usize>,
211        P: Fn(&M::Agg) -> bool,
212    {
213        let range = range.to_range_bounded(0, self.n).expect("invalid range");
214        let mut l = range.start + self.n;
215        let r = range.end + self.n;
216        self.propagate(l, false, true);
217        self.propagate(r, true, true);
218        let mut k = 0usize;
219        let mut acc = M::agg_unit();
220        while l < r >> k {
221            if l & 1 != 0 {
222                let nacc = M::agg_operate(&acc, &self.seg[l].0);
223                if p(&nacc) {
224                    return Some(self.bisect_perfect(l, acc, p).0);
225                }
226                acc = nacc;
227                l += 1;
228            }
229            l >>= 1;
230            k += 1;
231        }
232        for k in (0..k).rev() {
233            let r = r >> k;
234            if r & 1 != 0 {
235                let nacc = M::agg_operate(&acc, &self.seg[r - 1].0);
236                if p(&nacc) {
237                    return Some(self.bisect_perfect(r - 1, acc, p).0);
238                }
239                acc = nacc;
240            }
241        }
242        None
243    }
244    /// Returns the last index that satisfies a accumlative predicate.
245    pub fn rposition_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
246    where
247        R: RangeBounds<usize>,
248        P: Fn(&M::Agg) -> bool,
249    {
250        let range = range.to_range_bounded(0, self.n).expect("invalid range");
251        let mut l = range.start + self.n;
252        let mut r = range.end + self.n;
253        self.propagate(l, false, true);
254        self.propagate(r, true, true);
255        let mut c = 0usize;
256        let mut k = 0usize;
257        let mut acc = M::agg_unit();
258        while l >> k < r {
259            c <<= 1;
260            if l & (1 << k) != 0 {
261                l += 1 << k;
262                c += 1;
263            }
264            if r & 1 != 0 {
265                r -= 1;
266                let nacc = M::agg_operate(&self.seg[r].0, &acc);
267                if p(&nacc) {
268                    return Some(self.rbisect_perfect(r, acc, p).0);
269                }
270                acc = nacc;
271            }
272            r >>= 1;
273            k += 1;
274        }
275        for k in (0..k).rev() {
276            if c & 1 != 0 {
277                l -= 1 << k;
278                let l = l >> k;
279                let nacc = M::agg_operate(&self.seg[l].0, &acc);
280                if p(&nacc) {
281                    return Some(self.rbisect_perfect(l, acc, p).0);
282                }
283                acc = nacc;
284            }
285            c >>= 1;
286        }
287        None
288    }
More examples
Hide additional examples
crates/competitive/src/data_structure/lazy_segment_tree_map.rs (line 58)
57    fn get_mut(&mut self, k: usize) -> &mut (M::Agg, M::Act) {
58        self.seg.entry(k).or_insert((M::agg_unit(), M::act_unit()))
59    }
60    #[inline]
61    fn update_at(&mut self, k: usize, x: &M::Act) {
62        let n = self.n;
63        let a = self.get_mut(k);
64        let nx = M::act_agg(&a.0, x);
65        if k < n {
66            a.1 = M::act_operate(&a.1, x);
67        }
68        if let Some(nx) = nx {
69            a.0 = nx;
70        } else if k < n {
71            self.propagate_at(k);
72            self.recalc_at(k);
73        } else {
74            panic!("act failed on leaf");
75        }
76    }
77    #[inline]
78    fn recalc_at(&mut self, k: usize) {
79        let x = match (self.seg.get(&(2 * k)), self.seg.get(&(2 * k + 1))) {
80            (None, None) => M::agg_unit(),
81            (None, Some((y, _))) => y.clone(),
82            (Some((x, _)), None) => x.clone(),
83            (Some((x, _)), Some((y, _))) => M::agg_operate(x, y),
84        };
85        self.get_mut(k).0 = x;
86    }
87    #[inline]
88    fn propagate_at(&mut self, k: usize) {
89        debug_assert!(k < self.n);
90        let x = match self.seg.get_mut(&k) {
91            Some((_, x)) => replace(x, M::act_unit()),
92            None => M::act_unit(),
93        };
94        self.update_at(2 * k, &x);
95        self.update_at(2 * k + 1, &x);
96    }
97    #[inline]
98    fn propagate(&mut self, k: usize, right: bool, nofilt: bool) {
99        let right = right as usize;
100        for i in (1..(k + 1 - right).next_power_of_two().trailing_zeros()).rev() {
101            if nofilt || (k >> i) << i != k {
102                self.propagate_at((k - right) >> i);
103            }
104        }
105    }
106    #[inline]
107    fn recalc(&mut self, k: usize, right: bool, nofilt: bool) {
108        let right = right as usize;
109        for i in 1..(k + 1 - right).next_power_of_two().trailing_zeros() {
110            if nofilt || (k >> i) << i != k {
111                self.recalc_at((k - right) >> i);
112            }
113        }
114    }
115    pub fn update<R>(&mut self, range: R, x: M::Act)
116    where
117        R: RangeBounds<usize>,
118    {
119        let range = range.to_range_bounded(0, self.n).expect("invalid range");
120        let mut a = range.start + self.n;
121        let mut b = range.end + self.n;
122        self.propagate(a, false, false);
123        self.propagate(b, true, false);
124        while a < b {
125            if a & 1 != 0 {
126                self.update_at(a, &x);
127                a += 1;
128            }
129            if b & 1 != 0 {
130                b -= 1;
131                self.update_at(b, &x);
132            }
133            a /= 2;
134            b /= 2;
135        }
136        self.recalc(range.start + self.n, false, false);
137        self.recalc(range.end + self.n, true, false);
138    }
139    pub fn fold<R>(&mut self, range: R) -> M::Agg
140    where
141        R: RangeBounds<usize>,
142    {
143        let range = range.to_range_bounded(0, self.n).expect("invalid range");
144        let mut l = range.start + self.n;
145        let mut r = range.end + self.n;
146        self.propagate(l, false, true);
147        self.propagate(r, true, true);
148        let mut vl = M::agg_unit();
149        let mut vr = M::agg_unit();
150        while l < r {
151            if l & 1 != 0 {
152                if let Some((x, _)) = self.seg.get(&l) {
153                    vl = M::agg_operate(&vl, x);
154                }
155                l += 1;
156            }
157            if r & 1 != 0 {
158                r -= 1;
159                if let Some((x, _)) = self.seg.get(&r) {
160                    vr = M::agg_operate(x, &vr);
161                }
162            }
163            l /= 2;
164            r /= 2;
165        }
166        M::agg_operate(&vl, &vr)
167    }
168    pub fn set(&mut self, k: usize, x: M::Agg) {
169        let k = k + self.n;
170        self.propagate(k, false, true);
171        *self.get_mut(k) = (x, M::act_unit());
172        self.recalc(k, false, true);
173    }
174    pub fn get(&mut self, k: usize) -> M::Agg {
175        self.fold(k..k + 1)
176    }
177    pub fn fold_all(&mut self) -> M::Agg {
178        self.fold(0..self.n)
179    }
180    fn bisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
181    where
182        P: Fn(&M::Agg) -> bool,
183    {
184        while pos < self.n {
185            self.propagate_at(pos);
186            pos <<= 1;
187            let nacc = match self.seg.get(&pos) {
188                Some((x, _)) => M::agg_operate(&acc, x),
189                None => acc.clone(),
190            };
191            if !p(&nacc) {
192                acc = nacc;
193                pos += 1;
194            }
195        }
196        (pos - self.n, acc)
197    }
198    fn rbisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
199    where
200        P: Fn(&M::Agg) -> bool,
201    {
202        while pos < self.n {
203            self.propagate_at(pos);
204            pos = pos * 2 + 1;
205            let nacc = match self.seg.get(&pos) {
206                Some((x, _)) => M::agg_operate(x, &acc),
207                None => acc.clone(),
208            };
209            if !p(&nacc) {
210                acc = nacc;
211                pos -= 1;
212            }
213        }
214        (pos - self.n, acc)
215    }
216    /// Returns the first index that satisfies a accumlative predicate.
217    pub fn position_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
218    where
219        R: RangeBounds<usize>,
220        P: Fn(&M::Agg) -> bool,
221    {
222        let range = range.to_range_bounded(0, self.n).expect("invalid range");
223        let mut l = range.start + self.n;
224        let r = range.end + self.n;
225        self.propagate(l, false, true);
226        self.propagate(r, true, true);
227        let mut k = 0usize;
228        let mut acc = M::agg_unit();
229        while l < r >> k {
230            if l & 1 != 0 {
231                let nacc = match self.seg.get(&l) {
232                    Some((x, _)) => M::agg_operate(&acc, x),
233                    None => acc.clone(),
234                };
235                if p(&nacc) {
236                    return Some(self.bisect_perfect(l, acc, p).0);
237                }
238                acc = nacc;
239                l += 1;
240            }
241            l >>= 1;
242            k += 1;
243        }
244        for k in (0..k).rev() {
245            let r = r >> k;
246            if r & 1 != 0 {
247                let nacc = match self.seg.get(&(r - 1)) {
248                    Some((x, _)) => M::agg_operate(&acc, x),
249                    None => acc.clone(),
250                };
251                if p(&nacc) {
252                    return Some(self.bisect_perfect(r - 1, acc, p).0);
253                }
254                acc = nacc;
255            }
256        }
257        None
258    }
259    /// Returns the last index that satisfies a accumlative predicate.
260    pub fn rposition_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
261    where
262        R: RangeBounds<usize>,
263        P: Fn(&M::Agg) -> bool,
264    {
265        let range = range.to_range_bounded(0, self.n).expect("invalid range");
266        let mut l = range.start + self.n;
267        let mut r = range.end + self.n;
268        self.propagate(l, false, true);
269        self.propagate(r, true, true);
270        let mut c = 0usize;
271        let mut k = 0usize;
272        let mut acc = M::agg_unit();
273        while l >> k < r {
274            c <<= 1;
275            if l & (1 << k) != 0 {
276                l += 1 << k;
277                c += 1;
278            }
279            if r & 1 != 0 {
280                r -= 1;
281                let nacc = match self.seg.get(&r) {
282                    Some((x, _)) => M::agg_operate(x, &acc),
283                    None => acc.clone(),
284                };
285                if p(&nacc) {
286                    return Some(self.rbisect_perfect(r, acc, p).0);
287                }
288                acc = nacc;
289            }
290            r >>= 1;
291            k += 1;
292        }
293        for k in (0..k).rev() {
294            if c & 1 != 0 {
295                l -= 1 << k;
296                let l = l >> k;
297                let nacc = match self.seg.get(&l) {
298                    Some((x, _)) => M::agg_operate(x, &acc),
299                    None => acc.clone(),
300                };
301                if p(&nacc) {
302                    return Some(self.rbisect_perfect(l, acc, p).0);
303                }
304                acc = nacc;
305            }
306            c >>= 1;
307        }
308        None
309    }
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 159)
157    fn new(f: F) -> Self {
158        Self {
159            acc: T::agg_unit(),
160            f,
161            _marker: PhantomData,
162        }
163    }
164}
165impl<F, T> SplaySeeker for SeekByAccCond<F, T>
166where
167    F: FnMut(&T::Agg) -> bool,
168    T: MonoidAction,
169{
170    type S = LazyAggSplay<T>;
171    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
172        if let Some(lagg) = node.left().map(|l| &l.data().agg) {
173            let nacc = T::agg_operate(&self.acc, lagg);
174            if (self.f)(&nacc) {
175                return Ordering::Less;
176            }
177            self.acc = nacc;
178        };
179        self.acc = T::agg_operate(&self.acc, &T::single_agg(&node.data().key));
180        if (self.f)(&self.acc) {
181            Ordering::Equal
182        } else {
183            Ordering::Greater
184        }
185    }
186}
187
188struct SeekByRaccCond<F, T>
189where
190    T: MonoidAction,
191{
192    acc: T::Agg,
193    f: F,
194    _marker: PhantomData<fn() -> T>,
195}
196impl<F, T> SeekByRaccCond<F, T>
197where
198    T: MonoidAction,
199{
200    fn new(f: F) -> Self {
201        Self {
202            acc: T::agg_unit(),
203            f,
204            _marker: PhantomData,
205        }
206    }
207}
208impl<F, T> SplaySeeker for SeekByRaccCond<F, T>
209where
210    F: FnMut(&T::Agg) -> bool,
211    T: MonoidAction,
212{
213    type S = LazyAggSplay<T>;
214    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
215        if let Some(lagg) = node.right().map(|r| &r.data().agg) {
216            let nacc = T::agg_operate(lagg, &self.acc);
217            if (self.f)(&nacc) {
218                return Ordering::Greater;
219            }
220            self.acc = nacc;
221        };
222        self.acc = T::agg_operate(&T::single_agg(&node.data().key), &self.acc);
223        if (self.f)(&self.acc) {
224            Ordering::Equal
225        } else {
226            Ordering::Less
227        }
228    }
229}
230
231pub struct SplaySequence<T, A = MemoryPool<Node<LazyAggElement<T>>>>
232where
233    T: MonoidAction,
234    A: Allocator<Node<LazyAggElement<T>>>,
235{
236    root: Root<LazyAggSplay<T>>,
237    length: usize,
238    alloc: ManuallyDrop<A>,
239}
240
241impl<T, A> Debug for SplaySequence<T, A>
242where
243    T: MonoidAction,
244    T::Key: Debug,
245    T::Agg: Debug,
246    T::Act: Debug,
247    A: Allocator<Node<LazyAggElement<T>>>,
248{
249    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
250        f.debug_struct("SplayMap")
251            .field("root", &self.root)
252            .field("length", &self.length)
253            .finish()
254    }
255}
256
257impl<T, A> Drop for SplaySequence<T, A>
258where
259    T: MonoidAction,
260    A: Allocator<Node<LazyAggElement<T>>>,
261{
262    fn drop(&mut self) {
263        unsafe {
264            while let Some(node) = self.root.take_first() {
265                self.alloc.deallocate(node.into_dying().into_inner());
266            }
267            ManuallyDrop::drop(&mut self.alloc);
268        }
269    }
270}
271
272impl<T, A> Default for SplaySequence<T, A>
273where
274    T: MonoidAction,
275    A: Allocator<Node<LazyAggElement<T>>> + Default,
276{
277    fn default() -> Self {
278        Self {
279            root: Root::default(),
280            length: 0,
281            alloc: Default::default(),
282        }
283    }
284}
285
286impl<T> SplaySequence<T>
287where
288    T: MonoidAction,
289{
290    pub fn new() -> Self {
291        Default::default()
292    }
293    pub fn with_capacity(capacity: usize) -> Self {
294        Self {
295            root: Root::default(),
296            length: 0,
297            alloc: ManuallyDrop::new(MemoryPool::with_capacity(capacity)),
298        }
299    }
300    pub fn len(&self) -> usize {
301        self.length
302    }
303    pub fn is_empty(&self) -> bool {
304        self.length == 0
305    }
306}
307impl<T, A> SplaySequence<T, A>
308where
309    T: MonoidAction,
310    A: Allocator<Node<LazyAggElement<T>>>,
311{
312    fn range<R>(&mut self, range: R) -> NodeRange<'_, LazyAggSplay<T>>
313    where
314        R: RangeBounds<usize>,
315    {
316        let start = match range.start_bound() {
317            Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
318            Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
319            Bound::Unbounded => Bound::Unbounded,
320        };
321        let end = match range.end_bound() {
322            Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
323            Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
324            Bound::Unbounded => Bound::Unbounded,
325        };
326        self.root.range(start, end)
327    }
328    pub fn update<R>(&mut self, range: R, x: T::Act)
329    where
330        R: RangeBounds<usize>,
331    {
332        if let Some(root) = self.range(range).root_mut().root_data_mut() {
333            LazyAggSplay::<T>::update_lazy(root, &x);
334        }
335    }
336    pub fn fold<R>(&mut self, range: R) -> T::Agg
337    where
338        R: RangeBounds<usize>,
339    {
340        if let Some(root) = self.range(range).root().root() {
341            root.data().agg.clone()
342        } else {
343            T::agg_unit()
344        }
345    }
Source

fn act_unit() -> Self::Act

Examples found in repository?
crates/competitive/src/data_structure/lazy_segment_tree.rs (line 47)
46    pub fn new(n: usize) -> Self {
47        let seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
48        Self { n, seg }
49    }
50    pub fn from_vec(v: Vec<M::Agg>) -> Self {
51        let n = v.len();
52        let mut seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
53        for (i, x) in v.into_iter().enumerate() {
54            seg[i + n].0 = x;
55        }
56        for i in (1..n).rev() {
57            seg[i].0 = M::agg_operate(&seg[2 * i].0, &seg[2 * i + 1].0);
58        }
59        Self { n, seg }
60    }
61    pub fn from_keys(keys: impl ExactSizeIterator<Item = M::Key>) -> Self {
62        let n = keys.len();
63        let mut seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
64        for (i, key) in keys.enumerate() {
65            seg[i + n].0 = M::single_agg(&key);
66        }
67        for i in (1..n).rev() {
68            seg[i].0 = M::agg_operate(&seg[2 * i].0, &seg[2 * i + 1].0);
69        }
70        Self { n, seg }
71    }
72    #[inline]
73    fn update_at(&mut self, k: usize, x: &M::Act) {
74        let nx = M::act_agg(&self.seg[k].0, x);
75        if k < self.n {
76            self.seg[k].1 = M::act_operate(&self.seg[k].1, x);
77        }
78        if let Some(nx) = nx {
79            self.seg[k].0 = nx;
80        } else if k < self.n {
81            self.propagate_at(k);
82            self.recalc_at(k);
83        } else {
84            panic!("act failed on leaf");
85        }
86    }
87    #[inline]
88    fn recalc_at(&mut self, k: usize) {
89        self.seg[k].0 = M::agg_operate(&self.seg[2 * k].0, &self.seg[2 * k + 1].0);
90    }
91    #[inline]
92    fn propagate_at(&mut self, k: usize) {
93        debug_assert!(k < self.n);
94        let x = replace(&mut self.seg[k].1, M::act_unit());
95        self.update_at(2 * k, &x);
96        self.update_at(2 * k + 1, &x);
97    }
98    #[inline]
99    fn propagate(&mut self, k: usize, right: bool, nofilt: bool) {
100        let right = right as usize;
101        for i in (1..(k + 1 - right).next_power_of_two().trailing_zeros()).rev() {
102            if nofilt || (k >> i) << i != k {
103                self.propagate_at((k - right) >> i);
104            }
105        }
106    }
107    #[inline]
108    fn recalc(&mut self, k: usize, right: bool, nofilt: bool) {
109        let right = right as usize;
110        for i in 1..(k + 1 - right).next_power_of_two().trailing_zeros() {
111            if nofilt || (k >> i) << i != k {
112                self.recalc_at((k - right) >> i);
113            }
114        }
115    }
116    pub fn update<R>(&mut self, range: R, x: M::Act)
117    where
118        R: RangeBounds<usize>,
119    {
120        let range = range.to_range_bounded(0, self.n).expect("invalid range");
121        let mut a = range.start + self.n;
122        let mut b = range.end + self.n;
123        self.propagate(a, false, false);
124        self.propagate(b, true, false);
125        while a < b {
126            if a & 1 != 0 {
127                self.update_at(a, &x);
128                a += 1;
129            }
130            if b & 1 != 0 {
131                b -= 1;
132                self.update_at(b, &x);
133            }
134            a /= 2;
135            b /= 2;
136        }
137        self.recalc(range.start + self.n, false, false);
138        self.recalc(range.end + self.n, true, false);
139    }
140    pub fn fold<R>(&mut self, range: R) -> M::Agg
141    where
142        R: RangeBounds<usize>,
143    {
144        let range = range.to_range_bounded(0, self.n).expect("invalid range");
145        let mut l = range.start + self.n;
146        let mut r = range.end + self.n;
147        self.propagate(l, false, true);
148        self.propagate(r, true, true);
149        let mut vl = M::agg_unit();
150        let mut vr = M::agg_unit();
151        while l < r {
152            if l & 1 != 0 {
153                vl = M::agg_operate(&vl, &self.seg[l].0);
154                l += 1;
155            }
156            if r & 1 != 0 {
157                r -= 1;
158                vr = M::agg_operate(&self.seg[r].0, &vr);
159            }
160            l /= 2;
161            r /= 2;
162        }
163        M::agg_operate(&vl, &vr)
164    }
165    pub fn set(&mut self, k: usize, x: M::Agg) {
166        let k = k + self.n;
167        self.propagate(k, false, true);
168        self.seg[k] = (x, M::act_unit());
169        self.recalc(k, false, true);
170    }
More examples
Hide additional examples
crates/competitive/src/data_structure/lazy_segment_tree_map.rs (line 58)
57    fn get_mut(&mut self, k: usize) -> &mut (M::Agg, M::Act) {
58        self.seg.entry(k).or_insert((M::agg_unit(), M::act_unit()))
59    }
60    #[inline]
61    fn update_at(&mut self, k: usize, x: &M::Act) {
62        let n = self.n;
63        let a = self.get_mut(k);
64        let nx = M::act_agg(&a.0, x);
65        if k < n {
66            a.1 = M::act_operate(&a.1, x);
67        }
68        if let Some(nx) = nx {
69            a.0 = nx;
70        } else if k < n {
71            self.propagate_at(k);
72            self.recalc_at(k);
73        } else {
74            panic!("act failed on leaf");
75        }
76    }
77    #[inline]
78    fn recalc_at(&mut self, k: usize) {
79        let x = match (self.seg.get(&(2 * k)), self.seg.get(&(2 * k + 1))) {
80            (None, None) => M::agg_unit(),
81            (None, Some((y, _))) => y.clone(),
82            (Some((x, _)), None) => x.clone(),
83            (Some((x, _)), Some((y, _))) => M::agg_operate(x, y),
84        };
85        self.get_mut(k).0 = x;
86    }
87    #[inline]
88    fn propagate_at(&mut self, k: usize) {
89        debug_assert!(k < self.n);
90        let x = match self.seg.get_mut(&k) {
91            Some((_, x)) => replace(x, M::act_unit()),
92            None => M::act_unit(),
93        };
94        self.update_at(2 * k, &x);
95        self.update_at(2 * k + 1, &x);
96    }
97    #[inline]
98    fn propagate(&mut self, k: usize, right: bool, nofilt: bool) {
99        let right = right as usize;
100        for i in (1..(k + 1 - right).next_power_of_two().trailing_zeros()).rev() {
101            if nofilt || (k >> i) << i != k {
102                self.propagate_at((k - right) >> i);
103            }
104        }
105    }
106    #[inline]
107    fn recalc(&mut self, k: usize, right: bool, nofilt: bool) {
108        let right = right as usize;
109        for i in 1..(k + 1 - right).next_power_of_two().trailing_zeros() {
110            if nofilt || (k >> i) << i != k {
111                self.recalc_at((k - right) >> i);
112            }
113        }
114    }
115    pub fn update<R>(&mut self, range: R, x: M::Act)
116    where
117        R: RangeBounds<usize>,
118    {
119        let range = range.to_range_bounded(0, self.n).expect("invalid range");
120        let mut a = range.start + self.n;
121        let mut b = range.end + self.n;
122        self.propagate(a, false, false);
123        self.propagate(b, true, false);
124        while a < b {
125            if a & 1 != 0 {
126                self.update_at(a, &x);
127                a += 1;
128            }
129            if b & 1 != 0 {
130                b -= 1;
131                self.update_at(b, &x);
132            }
133            a /= 2;
134            b /= 2;
135        }
136        self.recalc(range.start + self.n, false, false);
137        self.recalc(range.end + self.n, true, false);
138    }
139    pub fn fold<R>(&mut self, range: R) -> M::Agg
140    where
141        R: RangeBounds<usize>,
142    {
143        let range = range.to_range_bounded(0, self.n).expect("invalid range");
144        let mut l = range.start + self.n;
145        let mut r = range.end + self.n;
146        self.propagate(l, false, true);
147        self.propagate(r, true, true);
148        let mut vl = M::agg_unit();
149        let mut vr = M::agg_unit();
150        while l < r {
151            if l & 1 != 0 {
152                if let Some((x, _)) = self.seg.get(&l) {
153                    vl = M::agg_operate(&vl, x);
154                }
155                l += 1;
156            }
157            if r & 1 != 0 {
158                r -= 1;
159                if let Some((x, _)) = self.seg.get(&r) {
160                    vr = M::agg_operate(x, &vr);
161                }
162            }
163            l /= 2;
164            r /= 2;
165        }
166        M::agg_operate(&vl, &vr)
167    }
168    pub fn set(&mut self, k: usize, x: M::Agg) {
169        let k = k + self.n;
170        self.propagate(k, false, true);
171        *self.get_mut(k) = (x, M::act_unit());
172        self.recalc(k, false, true);
173    }
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 65)
64    fn propagate(node: NodeRef<marker::DataMut<'_>, Self>) -> NodeRef<marker::DataMut<'_>, Self> {
65        let lazy = replace(&mut node.data_mut().lazy, T::act_unit());
66        if let Some(left) = node.left() {
67            Self::update_lazy(left, &lazy);
68        }
69        if let Some(right) = node.right() {
70            Self::update_lazy(right, &lazy);
71        }
72        if replace(&mut node.data_mut().rev, false) {
73            if let Some(left) = node.left() {
74                Self::reverse(left);
75            }
76            if let Some(right) = node.right() {
77                Self::reverse(right);
78            }
79        }
80        node
81    }
82    fn recalc(node: NodeRef<marker::DataMut<'_>, Self>) -> NodeRef<marker::DataMut<'_>, Self> {
83        let mut agg = T::single_agg(&node.data().key);
84        let mut size = 1;
85        if let Some(left) = node.left() {
86            let data = left.data();
87            agg = T::agg_operate(&data.agg, &agg);
88            // agg = <T::AggMonoid as Magma>::operate(&data.agg, &agg);
89            size += data.size;
90        }
91        if let Some(right) = node.right() {
92            let data = right.data();
93            agg = T::agg_operate(&agg, &data.agg);
94            size += data.size;
95        }
96        let data = node.data_mut();
97        data.agg = agg;
98        data.size = size;
99        node
100    }
101}
102impl<T> SplaySpec for LazyAggSplay<T>
103where
104    T: MonoidAction,
105{
106    type T = LazyAggElement<T>;
107    fn has_bottom_up() -> bool {
108        true
109    }
110    fn top_down(node: NodeRef<marker::DataMut<'_>, Self>) {
111        Self::propagate(node);
112    }
113    fn bottom_up(node: NodeRef<marker::DataMut<'_>, Self>) {
114        Self::recalc(node);
115    }
116}
117
118struct SeekBySize<T> {
119    index: usize,
120    _marker: PhantomData<fn() -> T>,
121}
122impl<T> SeekBySize<T> {
123    fn new(index: usize) -> Self {
124        Self {
125            index,
126            _marker: PhantomData,
127        }
128    }
129}
130impl<T> SplaySeeker for SeekBySize<T>
131where
132    T: MonoidAction,
133{
134    type S = LazyAggSplay<T>;
135    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
136        let lsize = node.left().map(|l| l.data().size).unwrap_or_default();
137        let ord = self.index.cmp(&lsize);
138        if matches!(ord, Ordering::Greater) {
139            self.index -= lsize + 1;
140        }
141        ord
142    }
143}
144
145struct SeekByAccCond<F, T>
146where
147    T: MonoidAction,
148{
149    acc: T::Agg,
150    f: F,
151    _marker: PhantomData<fn() -> T>,
152}
153impl<F, T> SeekByAccCond<F, T>
154where
155    T: MonoidAction,
156{
157    fn new(f: F) -> Self {
158        Self {
159            acc: T::agg_unit(),
160            f,
161            _marker: PhantomData,
162        }
163    }
164}
165impl<F, T> SplaySeeker for SeekByAccCond<F, T>
166where
167    F: FnMut(&T::Agg) -> bool,
168    T: MonoidAction,
169{
170    type S = LazyAggSplay<T>;
171    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
172        if let Some(lagg) = node.left().map(|l| &l.data().agg) {
173            let nacc = T::agg_operate(&self.acc, lagg);
174            if (self.f)(&nacc) {
175                return Ordering::Less;
176            }
177            self.acc = nacc;
178        };
179        self.acc = T::agg_operate(&self.acc, &T::single_agg(&node.data().key));
180        if (self.f)(&self.acc) {
181            Ordering::Equal
182        } else {
183            Ordering::Greater
184        }
185    }
186}
187
188struct SeekByRaccCond<F, T>
189where
190    T: MonoidAction,
191{
192    acc: T::Agg,
193    f: F,
194    _marker: PhantomData<fn() -> T>,
195}
196impl<F, T> SeekByRaccCond<F, T>
197where
198    T: MonoidAction,
199{
200    fn new(f: F) -> Self {
201        Self {
202            acc: T::agg_unit(),
203            f,
204            _marker: PhantomData,
205        }
206    }
207}
208impl<F, T> SplaySeeker for SeekByRaccCond<F, T>
209where
210    F: FnMut(&T::Agg) -> bool,
211    T: MonoidAction,
212{
213    type S = LazyAggSplay<T>;
214    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
215        if let Some(lagg) = node.right().map(|r| &r.data().agg) {
216            let nacc = T::agg_operate(lagg, &self.acc);
217            if (self.f)(&nacc) {
218                return Ordering::Greater;
219            }
220            self.acc = nacc;
221        };
222        self.acc = T::agg_operate(&T::single_agg(&node.data().key), &self.acc);
223        if (self.f)(&self.acc) {
224            Ordering::Equal
225        } else {
226            Ordering::Less
227        }
228    }
229}
230
231pub struct SplaySequence<T, A = MemoryPool<Node<LazyAggElement<T>>>>
232where
233    T: MonoidAction,
234    A: Allocator<Node<LazyAggElement<T>>>,
235{
236    root: Root<LazyAggSplay<T>>,
237    length: usize,
238    alloc: ManuallyDrop<A>,
239}
240
241impl<T, A> Debug for SplaySequence<T, A>
242where
243    T: MonoidAction,
244    T::Key: Debug,
245    T::Agg: Debug,
246    T::Act: Debug,
247    A: Allocator<Node<LazyAggElement<T>>>,
248{
249    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
250        f.debug_struct("SplayMap")
251            .field("root", &self.root)
252            .field("length", &self.length)
253            .finish()
254    }
255}
256
257impl<T, A> Drop for SplaySequence<T, A>
258where
259    T: MonoidAction,
260    A: Allocator<Node<LazyAggElement<T>>>,
261{
262    fn drop(&mut self) {
263        unsafe {
264            while let Some(node) = self.root.take_first() {
265                self.alloc.deallocate(node.into_dying().into_inner());
266            }
267            ManuallyDrop::drop(&mut self.alloc);
268        }
269    }
270}
271
272impl<T, A> Default for SplaySequence<T, A>
273where
274    T: MonoidAction,
275    A: Allocator<Node<LazyAggElement<T>>> + Default,
276{
277    fn default() -> Self {
278        Self {
279            root: Root::default(),
280            length: 0,
281            alloc: Default::default(),
282        }
283    }
284}
285
286impl<T> SplaySequence<T>
287where
288    T: MonoidAction,
289{
290    pub fn new() -> Self {
291        Default::default()
292    }
293    pub fn with_capacity(capacity: usize) -> Self {
294        Self {
295            root: Root::default(),
296            length: 0,
297            alloc: ManuallyDrop::new(MemoryPool::with_capacity(capacity)),
298        }
299    }
300    pub fn len(&self) -> usize {
301        self.length
302    }
303    pub fn is_empty(&self) -> bool {
304        self.length == 0
305    }
306}
307impl<T, A> SplaySequence<T, A>
308where
309    T: MonoidAction,
310    A: Allocator<Node<LazyAggElement<T>>>,
311{
312    fn range<R>(&mut self, range: R) -> NodeRange<'_, LazyAggSplay<T>>
313    where
314        R: RangeBounds<usize>,
315    {
316        let start = match range.start_bound() {
317            Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
318            Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
319            Bound::Unbounded => Bound::Unbounded,
320        };
321        let end = match range.end_bound() {
322            Bound::Included(&index) => Bound::Included(SeekBySize::new(index)),
323            Bound::Excluded(&index) => Bound::Excluded(SeekBySize::new(index)),
324            Bound::Unbounded => Bound::Unbounded,
325        };
326        self.root.range(start, end)
327    }
328    pub fn update<R>(&mut self, range: R, x: T::Act)
329    where
330        R: RangeBounds<usize>,
331    {
332        if let Some(root) = self.range(range).root_mut().root_data_mut() {
333            LazyAggSplay::<T>::update_lazy(root, &x);
334        }
335    }
336    pub fn fold<R>(&mut self, range: R) -> T::Agg
337    where
338        R: RangeBounds<usize>,
339    {
340        if let Some(root) = self.range(range).root().root() {
341            root.data().agg.clone()
342        } else {
343            T::agg_unit()
344        }
345    }
346    pub fn reverse<R>(&mut self, range: R)
347    where
348        R: RangeBounds<usize>,
349    {
350        if let Some(root) = self.range(range).root_mut().root_data_mut() {
351            LazyAggSplay::<T>::reverse(root);
352        }
353    }
354    pub fn get(&mut self, index: usize) -> Option<&T::Key> {
355        self.root.splay_by(SeekBySize::new(index))?;
356        self.root.root().map(|root| &root.data().key)
357    }
358    pub fn modify<F>(&mut self, index: usize, f: F)
359    where
360        F: FnOnce(&T::Key) -> T::Key,
361    {
362        self.root.splay_by(SeekBySize::new(index)).unwrap();
363        let data = self.root.root_data_mut().unwrap().data_mut();
364        data.key = f(&data.key);
365        LazyAggSplay::<T>::bottom_up(self.root.root_data_mut().unwrap());
366    }
367    pub fn insert(&mut self, index: usize, x: T::Key) {
368        assert!(index <= self.length);
369        self.root.splay_by(SeekBySize::new(index));
370        let agg = T::single_agg(&x);
371        unsafe {
372            let node = NodeRef::from_data(
373                LazyAggElement {
374                    key: x,
375                    agg,
376                    lazy: T::act_unit(),
377                    size: 1,
378                    rev: false,
379                },
380                self.alloc.deref_mut(),
381            );
382            if index == self.length {
383                self.root.insert_right(node);
384            } else {
385                self.root.insert_left(node);
386            }
387        }
388        self.length += 1;
389    }
390    pub fn remove(&mut self, index: usize) -> Option<T::Key> {
391        if index >= self.length {
392            return None;
393        }
394        self.root.splay_by(SeekBySize::new(index));
395        self.length -= 1;
396        let node = self.root.take_root().unwrap().into_dying();
397        unsafe { Some(node.into_data(self.alloc.deref_mut()).key) }
398    }
399    pub fn position_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
400    where
401        R: RangeBounds<usize>,
402        F: FnMut(&T::Agg) -> bool,
403    {
404        let mut range = self.range(range);
405        let ord = range.root_mut().splay_by(SeekByAccCond::new(f));
406        if !matches!(ord, Some(Ordering::Equal)) {
407            return None;
408        }
409        let front_size = range.front().size();
410        let left_size = range.root().left_size();
411        Some(front_size + left_size)
412    }
413    pub fn rposition_acc<R, F>(&mut self, range: R, f: F) -> Option<usize>
414    where
415        R: RangeBounds<usize>,
416        F: FnMut(&T::Agg) -> bool,
417    {
418        let mut range = self.range(range);
419        let ord = range.root_mut().splay_by(SeekByRaccCond::new(f));
420        if !matches!(ord, Some(Ordering::Equal)) {
421            return None;
422        }
423        let front_size = range.front().size();
424        let left_size = range.root().left_size();
425        Some(front_size + left_size)
426    }
427    pub fn rotate_left(&mut self, mid: usize) {
428        assert!(mid <= self.length);
429        if mid != 0 || mid != self.length {
430            self.range(mid..).drop_rotate_left()
431        }
432    }
433    pub fn rotate_right(&mut self, k: usize) {
434        assert!(k <= self.length);
435        self.rotate_left(self.length - k);
436    }
437}
438
439impl<T, A> Extend<T::Key> for SplaySequence<T, A>
440where
441    T: MonoidAction,
442    A: Allocator<Node<LazyAggElement<T>>>,
443{
444    fn extend<I>(&mut self, iter: I)
445    where
446        I: IntoIterator<Item = T::Key>,
447    {
448        let nodes: Vec<_> = unsafe {
449            iter.into_iter()
450                .map(|key| {
451                    let agg = T::single_agg(&key);
452                    NodeRef::from_data(
453                        LazyAggElement {
454                            key,
455                            agg,
456                            lazy: T::act_unit(),
457                            size: 1,
458                            rev: false,
459                        },
460                        self.alloc.deref_mut(),
461                    )
462                })
463                .collect()
464        };
465        self.length += nodes.len();
466        let mut root = unsafe { Root::from_single_nodes(nodes) };
467        self.root.append(&mut root);
468    }
Source

fn agg_operate(x: &Self::Agg, y: &Self::Agg) -> Self::Agg

Examples found in repository?
crates/competitive/src/data_structure/lazy_segment_tree_map.rs (line 83)
78    fn recalc_at(&mut self, k: usize) {
79        let x = match (self.seg.get(&(2 * k)), self.seg.get(&(2 * k + 1))) {
80            (None, None) => M::agg_unit(),
81            (None, Some((y, _))) => y.clone(),
82            (Some((x, _)), None) => x.clone(),
83            (Some((x, _)), Some((y, _))) => M::agg_operate(x, y),
84        };
85        self.get_mut(k).0 = x;
86    }
87    #[inline]
88    fn propagate_at(&mut self, k: usize) {
89        debug_assert!(k < self.n);
90        let x = match self.seg.get_mut(&k) {
91            Some((_, x)) => replace(x, M::act_unit()),
92            None => M::act_unit(),
93        };
94        self.update_at(2 * k, &x);
95        self.update_at(2 * k + 1, &x);
96    }
97    #[inline]
98    fn propagate(&mut self, k: usize, right: bool, nofilt: bool) {
99        let right = right as usize;
100        for i in (1..(k + 1 - right).next_power_of_two().trailing_zeros()).rev() {
101            if nofilt || (k >> i) << i != k {
102                self.propagate_at((k - right) >> i);
103            }
104        }
105    }
106    #[inline]
107    fn recalc(&mut self, k: usize, right: bool, nofilt: bool) {
108        let right = right as usize;
109        for i in 1..(k + 1 - right).next_power_of_two().trailing_zeros() {
110            if nofilt || (k >> i) << i != k {
111                self.recalc_at((k - right) >> i);
112            }
113        }
114    }
115    pub fn update<R>(&mut self, range: R, x: M::Act)
116    where
117        R: RangeBounds<usize>,
118    {
119        let range = range.to_range_bounded(0, self.n).expect("invalid range");
120        let mut a = range.start + self.n;
121        let mut b = range.end + self.n;
122        self.propagate(a, false, false);
123        self.propagate(b, true, false);
124        while a < b {
125            if a & 1 != 0 {
126                self.update_at(a, &x);
127                a += 1;
128            }
129            if b & 1 != 0 {
130                b -= 1;
131                self.update_at(b, &x);
132            }
133            a /= 2;
134            b /= 2;
135        }
136        self.recalc(range.start + self.n, false, false);
137        self.recalc(range.end + self.n, true, false);
138    }
139    pub fn fold<R>(&mut self, range: R) -> M::Agg
140    where
141        R: RangeBounds<usize>,
142    {
143        let range = range.to_range_bounded(0, self.n).expect("invalid range");
144        let mut l = range.start + self.n;
145        let mut r = range.end + self.n;
146        self.propagate(l, false, true);
147        self.propagate(r, true, true);
148        let mut vl = M::agg_unit();
149        let mut vr = M::agg_unit();
150        while l < r {
151            if l & 1 != 0 {
152                if let Some((x, _)) = self.seg.get(&l) {
153                    vl = M::agg_operate(&vl, x);
154                }
155                l += 1;
156            }
157            if r & 1 != 0 {
158                r -= 1;
159                if let Some((x, _)) = self.seg.get(&r) {
160                    vr = M::agg_operate(x, &vr);
161                }
162            }
163            l /= 2;
164            r /= 2;
165        }
166        M::agg_operate(&vl, &vr)
167    }
168    pub fn set(&mut self, k: usize, x: M::Agg) {
169        let k = k + self.n;
170        self.propagate(k, false, true);
171        *self.get_mut(k) = (x, M::act_unit());
172        self.recalc(k, false, true);
173    }
174    pub fn get(&mut self, k: usize) -> M::Agg {
175        self.fold(k..k + 1)
176    }
177    pub fn fold_all(&mut self) -> M::Agg {
178        self.fold(0..self.n)
179    }
180    fn bisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
181    where
182        P: Fn(&M::Agg) -> bool,
183    {
184        while pos < self.n {
185            self.propagate_at(pos);
186            pos <<= 1;
187            let nacc = match self.seg.get(&pos) {
188                Some((x, _)) => M::agg_operate(&acc, x),
189                None => acc.clone(),
190            };
191            if !p(&nacc) {
192                acc = nacc;
193                pos += 1;
194            }
195        }
196        (pos - self.n, acc)
197    }
198    fn rbisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
199    where
200        P: Fn(&M::Agg) -> bool,
201    {
202        while pos < self.n {
203            self.propagate_at(pos);
204            pos = pos * 2 + 1;
205            let nacc = match self.seg.get(&pos) {
206                Some((x, _)) => M::agg_operate(x, &acc),
207                None => acc.clone(),
208            };
209            if !p(&nacc) {
210                acc = nacc;
211                pos -= 1;
212            }
213        }
214        (pos - self.n, acc)
215    }
216    /// Returns the first index that satisfies a accumlative predicate.
217    pub fn position_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
218    where
219        R: RangeBounds<usize>,
220        P: Fn(&M::Agg) -> bool,
221    {
222        let range = range.to_range_bounded(0, self.n).expect("invalid range");
223        let mut l = range.start + self.n;
224        let r = range.end + self.n;
225        self.propagate(l, false, true);
226        self.propagate(r, true, true);
227        let mut k = 0usize;
228        let mut acc = M::agg_unit();
229        while l < r >> k {
230            if l & 1 != 0 {
231                let nacc = match self.seg.get(&l) {
232                    Some((x, _)) => M::agg_operate(&acc, x),
233                    None => acc.clone(),
234                };
235                if p(&nacc) {
236                    return Some(self.bisect_perfect(l, acc, p).0);
237                }
238                acc = nacc;
239                l += 1;
240            }
241            l >>= 1;
242            k += 1;
243        }
244        for k in (0..k).rev() {
245            let r = r >> k;
246            if r & 1 != 0 {
247                let nacc = match self.seg.get(&(r - 1)) {
248                    Some((x, _)) => M::agg_operate(&acc, x),
249                    None => acc.clone(),
250                };
251                if p(&nacc) {
252                    return Some(self.bisect_perfect(r - 1, acc, p).0);
253                }
254                acc = nacc;
255            }
256        }
257        None
258    }
259    /// Returns the last index that satisfies a accumlative predicate.
260    pub fn rposition_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
261    where
262        R: RangeBounds<usize>,
263        P: Fn(&M::Agg) -> bool,
264    {
265        let range = range.to_range_bounded(0, self.n).expect("invalid range");
266        let mut l = range.start + self.n;
267        let mut r = range.end + self.n;
268        self.propagate(l, false, true);
269        self.propagate(r, true, true);
270        let mut c = 0usize;
271        let mut k = 0usize;
272        let mut acc = M::agg_unit();
273        while l >> k < r {
274            c <<= 1;
275            if l & (1 << k) != 0 {
276                l += 1 << k;
277                c += 1;
278            }
279            if r & 1 != 0 {
280                r -= 1;
281                let nacc = match self.seg.get(&r) {
282                    Some((x, _)) => M::agg_operate(x, &acc),
283                    None => acc.clone(),
284                };
285                if p(&nacc) {
286                    return Some(self.rbisect_perfect(r, acc, p).0);
287                }
288                acc = nacc;
289            }
290            r >>= 1;
291            k += 1;
292        }
293        for k in (0..k).rev() {
294            if c & 1 != 0 {
295                l -= 1 << k;
296                let l = l >> k;
297                let nacc = match self.seg.get(&l) {
298                    Some((x, _)) => M::agg_operate(x, &acc),
299                    None => acc.clone(),
300                };
301                if p(&nacc) {
302                    return Some(self.rbisect_perfect(l, acc, p).0);
303                }
304                acc = nacc;
305            }
306            c >>= 1;
307        }
308        None
309    }
More examples
Hide additional examples
crates/competitive/src/data_structure/lazy_segment_tree.rs (line 57)
50    pub fn from_vec(v: Vec<M::Agg>) -> Self {
51        let n = v.len();
52        let mut seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
53        for (i, x) in v.into_iter().enumerate() {
54            seg[i + n].0 = x;
55        }
56        for i in (1..n).rev() {
57            seg[i].0 = M::agg_operate(&seg[2 * i].0, &seg[2 * i + 1].0);
58        }
59        Self { n, seg }
60    }
61    pub fn from_keys(keys: impl ExactSizeIterator<Item = M::Key>) -> Self {
62        let n = keys.len();
63        let mut seg = vec![(M::agg_unit(), M::act_unit()); 2 * n];
64        for (i, key) in keys.enumerate() {
65            seg[i + n].0 = M::single_agg(&key);
66        }
67        for i in (1..n).rev() {
68            seg[i].0 = M::agg_operate(&seg[2 * i].0, &seg[2 * i + 1].0);
69        }
70        Self { n, seg }
71    }
72    #[inline]
73    fn update_at(&mut self, k: usize, x: &M::Act) {
74        let nx = M::act_agg(&self.seg[k].0, x);
75        if k < self.n {
76            self.seg[k].1 = M::act_operate(&self.seg[k].1, x);
77        }
78        if let Some(nx) = nx {
79            self.seg[k].0 = nx;
80        } else if k < self.n {
81            self.propagate_at(k);
82            self.recalc_at(k);
83        } else {
84            panic!("act failed on leaf");
85        }
86    }
87    #[inline]
88    fn recalc_at(&mut self, k: usize) {
89        self.seg[k].0 = M::agg_operate(&self.seg[2 * k].0, &self.seg[2 * k + 1].0);
90    }
91    #[inline]
92    fn propagate_at(&mut self, k: usize) {
93        debug_assert!(k < self.n);
94        let x = replace(&mut self.seg[k].1, M::act_unit());
95        self.update_at(2 * k, &x);
96        self.update_at(2 * k + 1, &x);
97    }
98    #[inline]
99    fn propagate(&mut self, k: usize, right: bool, nofilt: bool) {
100        let right = right as usize;
101        for i in (1..(k + 1 - right).next_power_of_two().trailing_zeros()).rev() {
102            if nofilt || (k >> i) << i != k {
103                self.propagate_at((k - right) >> i);
104            }
105        }
106    }
107    #[inline]
108    fn recalc(&mut self, k: usize, right: bool, nofilt: bool) {
109        let right = right as usize;
110        for i in 1..(k + 1 - right).next_power_of_two().trailing_zeros() {
111            if nofilt || (k >> i) << i != k {
112                self.recalc_at((k - right) >> i);
113            }
114        }
115    }
116    pub fn update<R>(&mut self, range: R, x: M::Act)
117    where
118        R: RangeBounds<usize>,
119    {
120        let range = range.to_range_bounded(0, self.n).expect("invalid range");
121        let mut a = range.start + self.n;
122        let mut b = range.end + self.n;
123        self.propagate(a, false, false);
124        self.propagate(b, true, false);
125        while a < b {
126            if a & 1 != 0 {
127                self.update_at(a, &x);
128                a += 1;
129            }
130            if b & 1 != 0 {
131                b -= 1;
132                self.update_at(b, &x);
133            }
134            a /= 2;
135            b /= 2;
136        }
137        self.recalc(range.start + self.n, false, false);
138        self.recalc(range.end + self.n, true, false);
139    }
140    pub fn fold<R>(&mut self, range: R) -> M::Agg
141    where
142        R: RangeBounds<usize>,
143    {
144        let range = range.to_range_bounded(0, self.n).expect("invalid range");
145        let mut l = range.start + self.n;
146        let mut r = range.end + self.n;
147        self.propagate(l, false, true);
148        self.propagate(r, true, true);
149        let mut vl = M::agg_unit();
150        let mut vr = M::agg_unit();
151        while l < r {
152            if l & 1 != 0 {
153                vl = M::agg_operate(&vl, &self.seg[l].0);
154                l += 1;
155            }
156            if r & 1 != 0 {
157                r -= 1;
158                vr = M::agg_operate(&self.seg[r].0, &vr);
159            }
160            l /= 2;
161            r /= 2;
162        }
163        M::agg_operate(&vl, &vr)
164    }
165    pub fn set(&mut self, k: usize, x: M::Agg) {
166        let k = k + self.n;
167        self.propagate(k, false, true);
168        self.seg[k] = (x, M::act_unit());
169        self.recalc(k, false, true);
170    }
171    pub fn get(&mut self, k: usize) -> M::Agg {
172        self.fold(k..k + 1)
173    }
174    pub fn fold_all(&mut self) -> M::Agg {
175        self.fold(0..self.n)
176    }
177    fn bisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
178    where
179        P: Fn(&M::Agg) -> bool,
180    {
181        while pos < self.n {
182            self.propagate_at(pos);
183            pos <<= 1;
184            let nacc = M::agg_operate(&acc, &self.seg[pos].0);
185            if !p(&nacc) {
186                acc = nacc;
187                pos += 1;
188            }
189        }
190        (pos - self.n, acc)
191    }
192    fn rbisect_perfect<P>(&mut self, mut pos: usize, mut acc: M::Agg, p: P) -> (usize, M::Agg)
193    where
194        P: Fn(&M::Agg) -> bool,
195    {
196        while pos < self.n {
197            self.propagate_at(pos);
198            pos = pos * 2 + 1;
199            let nacc = M::agg_operate(&self.seg[pos].0, &acc);
200            if !p(&nacc) {
201                acc = nacc;
202                pos -= 1;
203            }
204        }
205        (pos - self.n, acc)
206    }
207    /// Returns the first index that satisfies a accumlative predicate.
208    pub fn position_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
209    where
210        R: RangeBounds<usize>,
211        P: Fn(&M::Agg) -> bool,
212    {
213        let range = range.to_range_bounded(0, self.n).expect("invalid range");
214        let mut l = range.start + self.n;
215        let r = range.end + self.n;
216        self.propagate(l, false, true);
217        self.propagate(r, true, true);
218        let mut k = 0usize;
219        let mut acc = M::agg_unit();
220        while l < r >> k {
221            if l & 1 != 0 {
222                let nacc = M::agg_operate(&acc, &self.seg[l].0);
223                if p(&nacc) {
224                    return Some(self.bisect_perfect(l, acc, p).0);
225                }
226                acc = nacc;
227                l += 1;
228            }
229            l >>= 1;
230            k += 1;
231        }
232        for k in (0..k).rev() {
233            let r = r >> k;
234            if r & 1 != 0 {
235                let nacc = M::agg_operate(&acc, &self.seg[r - 1].0);
236                if p(&nacc) {
237                    return Some(self.bisect_perfect(r - 1, acc, p).0);
238                }
239                acc = nacc;
240            }
241        }
242        None
243    }
244    /// Returns the last index that satisfies a accumlative predicate.
245    pub fn rposition_acc<R, P>(&mut self, range: R, p: P) -> Option<usize>
246    where
247        R: RangeBounds<usize>,
248        P: Fn(&M::Agg) -> bool,
249    {
250        let range = range.to_range_bounded(0, self.n).expect("invalid range");
251        let mut l = range.start + self.n;
252        let mut r = range.end + self.n;
253        self.propagate(l, false, true);
254        self.propagate(r, true, true);
255        let mut c = 0usize;
256        let mut k = 0usize;
257        let mut acc = M::agg_unit();
258        while l >> k < r {
259            c <<= 1;
260            if l & (1 << k) != 0 {
261                l += 1 << k;
262                c += 1;
263            }
264            if r & 1 != 0 {
265                r -= 1;
266                let nacc = M::agg_operate(&self.seg[r].0, &acc);
267                if p(&nacc) {
268                    return Some(self.rbisect_perfect(r, acc, p).0);
269                }
270                acc = nacc;
271            }
272            r >>= 1;
273            k += 1;
274        }
275        for k in (0..k).rev() {
276            if c & 1 != 0 {
277                l -= 1 << k;
278                let l = l >> k;
279                let nacc = M::agg_operate(&self.seg[l].0, &acc);
280                if p(&nacc) {
281                    return Some(self.rbisect_perfect(l, acc, p).0);
282                }
283                acc = nacc;
284            }
285            c >>= 1;
286        }
287        None
288    }
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 87)
82    fn recalc(node: NodeRef<marker::DataMut<'_>, Self>) -> NodeRef<marker::DataMut<'_>, Self> {
83        let mut agg = T::single_agg(&node.data().key);
84        let mut size = 1;
85        if let Some(left) = node.left() {
86            let data = left.data();
87            agg = T::agg_operate(&data.agg, &agg);
88            // agg = <T::AggMonoid as Magma>::operate(&data.agg, &agg);
89            size += data.size;
90        }
91        if let Some(right) = node.right() {
92            let data = right.data();
93            agg = T::agg_operate(&agg, &data.agg);
94            size += data.size;
95        }
96        let data = node.data_mut();
97        data.agg = agg;
98        data.size = size;
99        node
100    }
101}
102impl<T> SplaySpec for LazyAggSplay<T>
103where
104    T: MonoidAction,
105{
106    type T = LazyAggElement<T>;
107    fn has_bottom_up() -> bool {
108        true
109    }
110    fn top_down(node: NodeRef<marker::DataMut<'_>, Self>) {
111        Self::propagate(node);
112    }
113    fn bottom_up(node: NodeRef<marker::DataMut<'_>, Self>) {
114        Self::recalc(node);
115    }
116}
117
118struct SeekBySize<T> {
119    index: usize,
120    _marker: PhantomData<fn() -> T>,
121}
122impl<T> SeekBySize<T> {
123    fn new(index: usize) -> Self {
124        Self {
125            index,
126            _marker: PhantomData,
127        }
128    }
129}
130impl<T> SplaySeeker for SeekBySize<T>
131where
132    T: MonoidAction,
133{
134    type S = LazyAggSplay<T>;
135    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
136        let lsize = node.left().map(|l| l.data().size).unwrap_or_default();
137        let ord = self.index.cmp(&lsize);
138        if matches!(ord, Ordering::Greater) {
139            self.index -= lsize + 1;
140        }
141        ord
142    }
143}
144
145struct SeekByAccCond<F, T>
146where
147    T: MonoidAction,
148{
149    acc: T::Agg,
150    f: F,
151    _marker: PhantomData<fn() -> T>,
152}
153impl<F, T> SeekByAccCond<F, T>
154where
155    T: MonoidAction,
156{
157    fn new(f: F) -> Self {
158        Self {
159            acc: T::agg_unit(),
160            f,
161            _marker: PhantomData,
162        }
163    }
164}
165impl<F, T> SplaySeeker for SeekByAccCond<F, T>
166where
167    F: FnMut(&T::Agg) -> bool,
168    T: MonoidAction,
169{
170    type S = LazyAggSplay<T>;
171    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
172        if let Some(lagg) = node.left().map(|l| &l.data().agg) {
173            let nacc = T::agg_operate(&self.acc, lagg);
174            if (self.f)(&nacc) {
175                return Ordering::Less;
176            }
177            self.acc = nacc;
178        };
179        self.acc = T::agg_operate(&self.acc, &T::single_agg(&node.data().key));
180        if (self.f)(&self.acc) {
181            Ordering::Equal
182        } else {
183            Ordering::Greater
184        }
185    }
186}
187
188struct SeekByRaccCond<F, T>
189where
190    T: MonoidAction,
191{
192    acc: T::Agg,
193    f: F,
194    _marker: PhantomData<fn() -> T>,
195}
196impl<F, T> SeekByRaccCond<F, T>
197where
198    T: MonoidAction,
199{
200    fn new(f: F) -> Self {
201        Self {
202            acc: T::agg_unit(),
203            f,
204            _marker: PhantomData,
205        }
206    }
207}
208impl<F, T> SplaySeeker for SeekByRaccCond<F, T>
209where
210    F: FnMut(&T::Agg) -> bool,
211    T: MonoidAction,
212{
213    type S = LazyAggSplay<T>;
214    fn splay_seek(&mut self, node: NodeRef<marker::Immut<'_>, Self::S>) -> Ordering {
215        if let Some(lagg) = node.right().map(|r| &r.data().agg) {
216            let nacc = T::agg_operate(lagg, &self.acc);
217            if (self.f)(&nacc) {
218                return Ordering::Greater;
219            }
220            self.acc = nacc;
221        };
222        self.acc = T::agg_operate(&T::single_agg(&node.data().key), &self.acc);
223        if (self.f)(&self.acc) {
224            Ordering::Equal
225        } else {
226            Ordering::Less
227        }
228    }
Source

fn act_operate(x: &Self::Act, y: &Self::Act) -> Self::Act

Examples found in repository?
crates/competitive/src/data_structure/lazy_segment_tree.rs (line 76)
73    fn update_at(&mut self, k: usize, x: &M::Act) {
74        let nx = M::act_agg(&self.seg[k].0, x);
75        if k < self.n {
76            self.seg[k].1 = M::act_operate(&self.seg[k].1, x);
77        }
78        if let Some(nx) = nx {
79            self.seg[k].0 = nx;
80        } else if k < self.n {
81            self.propagate_at(k);
82            self.recalc_at(k);
83        } else {
84            panic!("act failed on leaf");
85        }
86    }
More examples
Hide additional examples
crates/competitive/src/data_structure/lazy_segment_tree_map.rs (line 66)
61    fn update_at(&mut self, k: usize, x: &M::Act) {
62        let n = self.n;
63        let a = self.get_mut(k);
64        let nx = M::act_agg(&a.0, x);
65        if k < n {
66            a.1 = M::act_operate(&a.1, x);
67        }
68        if let Some(nx) = nx {
69            a.0 = nx;
70        } else if k < n {
71            self.propagate_at(k);
72            self.recalc_at(k);
73        } else {
74            panic!("act failed on leaf");
75        }
76    }
Source

fn agg_operate_assign(x: &mut Self::Agg, y: &Self::Agg)

Source

fn act_operate_assign(x: &mut Self::Act, y: &Self::Act)

Examples found in repository?
crates/competitive/src/data_structure/splay_tree/sequence.rs (line 50)
49    pub fn update_lazy(mut node: NodeRef<marker::DataMut<'_>, Self>, lazy: &T::Act) {
50        T::act_operate_assign(&mut node.data_mut().lazy, lazy);
51        node.data_mut().key = T::act_key(&node.data().key, lazy);
52        if let Some(nxlazy) = T::act_agg(&node.data().agg, lazy) {
53            node.data_mut().agg = nxlazy;
54        } else {
55            node = Self::propagate(node);
56            Self::recalc(node);
57        }
58    }

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

Source§

impl<M> MonoidAction for EmptyLazy<M>
where M: Monoid,

Source§

type Key = <M as Magma>::T

Source§

type Agg = <M as Magma>::T

Source§

type Act = ()

Source§

type AggMonoid = M

Source§

type ActMonoid = ()

Source§

impl<M> MonoidAction for FlattenAction<M>
where M: Monoid,

Source§

type Key = <M as Magma>::T

Source§

type Agg = <M as Magma>::T

Source§

type Act = <M as Magma>::T

Source§

type AggMonoid = M

Source§

type ActMonoid = M

Source§

impl<T> MonoidAction for EmptyAction<T>
where T: Clone,

Source§

impl<T> MonoidAction for RangeMaxRangeAdd<T>
where T: Clone + Ord + Bounded + Zero + Add<Output = T>,

Source§

impl<T> MonoidAction for RangeMaxRangeUpdate<T>
where T: Clone + PartialEq + Ord + Bounded,

Source§

impl<T> MonoidAction for RangeMinRangeAdd<T>
where T: Clone + Ord + Bounded + Zero + Add<Output = T>,

Source§

impl<T> MonoidAction for RangeMinRangeUpdate<T>
where T: Clone + PartialEq + Ord + Bounded,

Source§

impl<T> MonoidAction for RangeSumRangeAdd<T>
where T: Copy + Zero + One + Add<Output = T> + Mul<Output = T> + PartialEq,

Source§

impl<T> MonoidAction for RangeSumRangeChminChmaxAdd<T>
where T: Copy + Zero + One + Ord + Bounded + Add<Output = T> + Sub<Output = T> + Mul<Output = T> + PartialEq,

Source§

impl<T> MonoidAction for RangeSumRangeLinear<T>
where T: Copy + Zero + One + Add<Output = T> + Mul<Output = T> + PartialEq,

Source§

impl<T> MonoidAction for RangeSumRangeUpdate<T>
where T: Copy + Zero + One + Add<Output = T> + Mul<Output = T> + PartialEq,