competitive/data_structure/
range_map.rs

1use std::{
2    collections::{BTreeMap, btree_map},
3    iter::{Extend, FromIterator},
4};
5
6/// A map to control intervals that have same values.
7#[derive(Debug, Clone)]
8pub struct RangeMap<K, V> {
9    map: BTreeMap<(K, K), V>,
10}
11impl<K, V> Default for RangeMap<K, V>
12where
13    K: Ord,
14{
15    fn default() -> Self {
16        Self {
17            map: Default::default(),
18        }
19    }
20}
21impl<K, V> RangeMap<K, V> {
22    /// Makes a new, empty `RangeMap`.
23    pub fn new() -> Self
24    where
25        K: Ord,
26    {
27        Default::default()
28    }
29    /// Clears the map, removing all elements.
30    pub fn clear(&mut self)
31    where
32        K: Ord,
33    {
34        self.map.clear();
35    }
36    /// Returns true if the map contains a value for the key.
37    pub fn contains_key(&self, key: &K) -> bool
38    where
39        K: Clone + Ord,
40    {
41        self.get(key).is_some()
42    }
43    /// Returns a reference to the value corresponding to the key.
44    pub fn get(&self, key: &K) -> Option<&V>
45    where
46        K: Clone + Ord,
47    {
48        self.get_range_value(key).map(|(_, v)| v)
49    }
50    /// Returns the range-value pair corresponding to the key.
51    pub fn get_range_value(&self, key: &K) -> Option<(&(K, K), &V)>
52    where
53        K: Clone + Ord,
54    {
55        self.get_right_if(key, |r, _| key == &r.0)
56            .or_else(|| self.get_left_if(key, |r, _| key < &r.1))
57    }
58    /// Inserts values into the specified range.
59    pub fn insert(&mut self, range: (K, K), value: V)
60    where
61        K: Clone + Ord,
62        V: Clone + Eq,
63    {
64        self.insert_with(range, value, |_, _| {});
65    }
66    /// Insert values and operate old range-value pairs.
67    pub fn insert_with<F>(&mut self, range: (K, K), value: V, mut f: F)
68    where
69        K: Clone + Ord,
70        V: Clone + Eq,
71        F: FnMut((K, K), V),
72    {
73        if range.0 >= range.1 {
74            return;
75        }
76        let mut ins_range = range.clone();
77        if let Some((r, v)) = self.pop_left_if(&range.0, |r, v| {
78            range.0 < r.1 || range.0 == r.1 && &value == v
79        }) {
80            if range.1 < r.1 {
81                if value == v {
82                    ins_range = r;
83                } else {
84                    self.map.insert((r.0, range.0.clone()), v.clone());
85                    self.map.insert((range.1.clone(), r.1), v.clone());
86                }
87                f(range.clone(), v);
88            } else {
89                if value == v {
90                    ins_range.0 = r.0;
91                } else {
92                    self.map.insert((r.0, range.0.clone()), v.clone());
93                }
94                if range.0 < r.1 {
95                    f((range.0.clone(), r.1), v);
96                }
97            }
98        }
99        let mut wait = None;
100        if let Some((r, _)) = self.pop_right_if(&range.1, |r, v| range.1 == r.0 && &value == v) {
101            ins_range.1 = r.1;
102        } else if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
103            if value == v {
104                ins_range.1 = r.1;
105            } else {
106                self.map.insert((range.1.clone(), r.1), v.clone());
107            }
108            wait = Some(((r.0, range.1.clone()), v));
109        }
110        let mut f = self.drain_with_inner(range, f);
111        if let Some((r, v)) = wait {
112            f(r, v);
113        }
114        self.map.insert(ins_range, value);
115    }
116    /// Remove values contained in the range.
117    pub fn remove(&mut self, range: (K, K))
118    where
119        K: Clone + Ord,
120        V: Clone,
121    {
122        self.drain_with(range, |_, _| {});
123    }
124    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
125    pub fn get_left_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
126    where
127        K: Clone + Ord,
128        F: FnMut(&(K, K), &V) -> bool,
129    {
130        self.map
131            .range(..(key.clone(), key.clone()))
132            .next_back()
133            .filter(|(r, v)| pred(r, v))
134    }
135    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
136    pub fn get_right_if<F>(&self, key: &K, mut pred: F) -> Option<(&(K, K), &V)>
137    where
138        K: Clone + Ord,
139        F: FnMut(&(K, K), &V) -> bool,
140    {
141        self.map
142            .range((key.clone(), key.clone())..)
143            .next()
144            .filter(|(r, v)| pred(r, v))
145    }
146    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
147    pub fn pop_left_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
148    where
149        K: Clone + Ord,
150        F: FnMut(&(K, K), &V) -> bool,
151    {
152        match self.get_left_if(key, pred) {
153            Some((r, _)) => {
154                let r = r.clone();
155                let v = self.map.remove(&r).unwrap();
156                Some((r, v))
157            }
158            None => None,
159        }
160    }
161    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
162    pub fn pop_right_if<F>(&mut self, key: &K, pred: F) -> Option<((K, K), V)>
163    where
164        K: Clone + Ord,
165        F: FnMut(&(K, K), &V) -> bool,
166    {
167        match self.get_right_if(key, pred) {
168            Some((r, _)) => {
169                let r = r.clone();
170                let v = self.map.remove(&r).unwrap();
171                Some((r, v))
172            }
173            None => None,
174        }
175    }
176    /// Operate and consume range-value pairs in range when no overlapping.
177    fn drain_with_inner<F>(&mut self, range: (K, K), mut f: F) -> F
178    where
179        K: Clone + Ord,
180        F: FnMut((K, K), V),
181    {
182        while let Some((r, _)) = self
183            .map
184            .range((range.0.clone(), range.0.clone())..(range.1.clone(), range.1.clone()))
185            .next()
186        {
187            let r = r.clone();
188            let v = self.map.remove(&r).unwrap();
189            f(r, v);
190        }
191        f
192    }
193    /// Operate and consume range-value pairs in range.
194    pub fn drain_with<F>(&mut self, range: (K, K), mut f: F)
195    where
196        K: Clone + Ord,
197        V: Clone,
198        F: FnMut((K, K), V),
199    {
200        if let Some((r, v)) = self.pop_left_if(&range.0, |r, _| range.0 < r.1) {
201            if range.1 < r.1 {
202                f(range.clone(), v.clone());
203                self.map.insert((range.1.clone(), r.1), v.clone());
204            } else {
205                f((range.0.clone(), r.1), v.clone());
206            }
207            self.map.insert((r.0, range.0.clone()), v);
208        }
209        let mut wait = None;
210        if let Some((r, v)) = self.pop_left_if(&range.1, |r, _| range.1 < r.1) {
211            wait = Some(((r.0, range.1.clone()), v.clone()));
212            self.map.insert((range.1.clone(), r.1), v);
213        }
214        let mut f = self.drain_with_inner(range, f);
215        if let Some((r, v)) = wait {
216            f(r, v);
217        }
218    }
219    pub fn iter(&self) -> btree_map::Iter<'_, (K, K), V> {
220        self.map.iter()
221    }
222    pub fn iter_mut(&mut self) -> btree_map::IterMut<'_, (K, K), V> {
223        self.map.iter_mut()
224    }
225    pub fn keys(&self) -> btree_map::Keys<'_, (K, K), V> {
226        self.map.keys()
227    }
228    pub fn values(&self) -> btree_map::Values<'_, (K, K), V> {
229        self.map.values()
230    }
231    pub fn values_mut(&mut self) -> btree_map::ValuesMut<'_, (K, K), V> {
232        self.map.values_mut()
233    }
234}
235impl<K, V> Extend<((K, K), V)> for RangeMap<K, V>
236where
237    K: Clone + Ord,
238    V: Clone + Eq,
239{
240    fn extend<T: IntoIterator<Item = ((K, K), V)>>(&mut self, iter: T) {
241        for (range, value) in iter {
242            self.insert(range, value);
243        }
244    }
245}
246impl<K, V> FromIterator<((K, K), V)> for RangeMap<K, V>
247where
248    K: Clone + Ord,
249    V: Clone + Eq,
250{
251    fn from_iter<T: IntoIterator<Item = ((K, K), V)>>(iter: T) -> Self {
252        let mut map = Self::new();
253        map.extend(iter);
254        map
255    }
256}
257
258/// A set to control intervals.
259#[derive(Debug, Clone)]
260pub struct RangeSet<T> {
261    map: RangeMap<T, ()>,
262}
263impl<T> Default for RangeSet<T>
264where
265    T: Ord,
266{
267    fn default() -> Self {
268        Self {
269            map: Default::default(),
270        }
271    }
272}
273impl<T> RangeSet<T> {
274    /// Makes a new, empty `RangeSet`.
275    pub fn new() -> Self
276    where
277        T: Ord,
278    {
279        Default::default()
280    }
281    /// Clears the set, removing all elements.
282    pub fn clear(&mut self)
283    where
284        T: Ord,
285    {
286        self.map.clear();
287    }
288    /// Returns true if the set contains a key.
289    pub fn contains(&self, key: &T) -> bool
290    where
291        T: Clone + Ord,
292    {
293        self.get_range(key).is_some()
294    }
295    /// Returns the range corresponding to the key.
296    pub fn get_range(&self, key: &T) -> Option<&(T, T)>
297    where
298        T: Clone + Ord,
299    {
300        self.map.get_range_value(key).map(|(r, _)| r)
301    }
302    /// Inserts into the specified range.
303    pub fn insert(&mut self, range: (T, T))
304    where
305        T: Clone + Ord,
306    {
307        self.insert_with(range, |_| {});
308    }
309    /// Insert and operate old range.
310    pub fn insert_with<F>(&mut self, range: (T, T), mut f: F)
311    where
312        T: Clone + Ord,
313        F: FnMut((T, T)),
314    {
315        self.map.insert_with(range, (), |r, _| f(r))
316    }
317    /// Remove items contained in the range.
318    pub fn remove(&mut self, range: (T, T))
319    where
320        T: Clone + Ord,
321    {
322        self.drain_with(range, |_| {});
323    }
324    /// Get a left neighboring range of `[key, key)` if the predicate is satisfied.
325    pub fn get_left_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
326    where
327        T: Clone + Ord,
328        F: FnMut(&(T, T)) -> bool,
329    {
330        self.map.get_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
331    }
332    /// Get a right neighboring range of `[key, key)` if the predicate is satisfied.
333    pub fn get_right_if<F>(&self, key: &T, mut pred: F) -> Option<&(T, T)>
334    where
335        T: Clone + Ord,
336        F: FnMut(&(T, T)) -> bool,
337    {
338        self.map.get_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
339    }
340    /// Pop a left neighboring range of `[key, key)` if the predicate is satisfied.
341    pub fn pop_left_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
342    where
343        T: Clone + Ord,
344        F: FnMut(&(T, T)) -> bool,
345    {
346        self.map.pop_left_if(key, |r, _| pred(r)).map(|(r, _)| r)
347    }
348    /// Pop a right neighboring range of `[key, key)` if the predicate is satisfied.
349    pub fn pop_right_if<F>(&mut self, key: &T, mut pred: F) -> Option<(T, T)>
350    where
351        T: Clone + Ord,
352        F: FnMut(&(T, T)) -> bool,
353    {
354        self.map.pop_right_if(key, |r, _| pred(r)).map(|(r, _)| r)
355    }
356    /// Operate and consume in range.
357    pub fn drain_with<F>(&mut self, range: (T, T), mut f: F)
358    where
359        T: Clone + Ord,
360        F: FnMut((T, T)),
361    {
362        self.map.drain_with(range, |r, _| f(r));
363    }
364    pub fn iter(&self) -> btree_map::Keys<'_, (T, T), ()> {
365        self.map.keys()
366    }
367}
368impl<K> Extend<(K, K)> for RangeSet<K>
369where
370    K: Clone + Ord,
371{
372    fn extend<T: IntoIterator<Item = (K, K)>>(&mut self, iter: T) {
373        for range in iter {
374            self.insert(range);
375        }
376    }
377}
378impl<K> FromIterator<(K, K)> for RangeSet<K>
379where
380    K: Clone + Ord,
381{
382    fn from_iter<T: IntoIterator<Item = (K, K)>>(iter: T) -> Self {
383        let mut map = Self::new();
384        map.extend(iter);
385        map
386    }
387}
388
389#[cfg(test)]
390mod tests {
391    use super::*;
392    use crate::tools::{NotEmptySegment as Nes, Xorshift};
393
394    #[test]
395    fn test_insert() {
396        let mut map: RangeMap<usize, usize> = Default::default();
397        map.insert((1, 3), 0);
398        assert_eq!(map.get_range_value(&0), None);
399        assert_eq!(map.get_range_value(&1), Some((&(1, 3), &0)));
400        assert_eq!(map.get_range_value(&2), Some((&(1, 3), &0)));
401        assert_eq!(map.get_range_value(&3), None);
402
403        map.insert_with((2, 4), 1, |r, v| assert_eq!((r, v), ((2, 3), 0)));
404        assert_eq!(map.get_range_value(&0), None);
405        assert_eq!(map.get_range_value(&1), Some((&(1, 2), &0)));
406        assert_eq!(map.get_range_value(&2), Some((&(2, 4), &1)));
407        assert_eq!(map.get_range_value(&3), Some((&(2, 4), &1)));
408        assert_eq!(map.get_range_value(&4), None);
409
410        map.insert_with((2, 3), 2, |r, v| assert_eq!((r, v), ((2, 3), 1)));
411        assert_eq!(map.get_range_value(&0), None);
412        assert_eq!(map.get_range_value(&1), Some((&(1, 2), &0)));
413        assert_eq!(map.get_range_value(&2), Some((&(2, 3), &2)));
414        assert_eq!(map.get_range_value(&3), Some((&(3, 4), &1)));
415        assert_eq!(map.get_range_value(&4), None);
416
417        map.insert((1, 8), 3);
418        map.insert((4, 6), 4);
419        assert_eq!(map.get_range_value(&6), Some((&(6, 8), &3)));
420    }
421
422    #[test]
423    fn test_range_map() {
424        let mut rng = Xorshift::default();
425        const N: usize = 200;
426        const Q: usize = 5000;
427        const A: i64 = 100;
428        let mut map: RangeMap<usize, i64> = Default::default();
429        let mut arr = vec![None; N];
430        for _ in 0..Q {
431            match rng.random(0..5) {
432                0 => {
433                    let key = rng.random(..N);
434                    if let Some((r, &v)) = map.get_range_value(&key) {
435                        arr[r.0..r.1].iter_mut().for_each(|a| {
436                            assert_eq!(Some(v), *a);
437                        });
438                    };
439                }
440                1 => {
441                    let range = rng.random(Nes(N));
442                    map.drain_with(range, |r, v| {
443                        arr[r.0.max(range.0)..r.1.min(range.1)]
444                            .iter_mut()
445                            .for_each(|a| {
446                                assert_eq!(Some(v), *a);
447                                *a = None;
448                            });
449                    });
450                    arr[range.0..range.1]
451                        .iter_mut()
452                        .for_each(|a| assert_eq!(*a, None));
453                }
454                _ => {
455                    let range = rng.random(Nes(N));
456                    let value = rng.random(-A..=A);
457                    map.insert_with(range, value, |r, v| {
458                        arr[r.0.max(range.0)..r.1.min(range.1)]
459                            .iter_mut()
460                            .for_each(|a| {
461                                assert_eq!(Some(v), *a);
462                                *a = None;
463                            });
464                    });
465                    arr[range.0..range.1].iter_mut().for_each(|a| {
466                        assert_eq!(*a, None);
467                        *a = Some(value);
468                    });
469                }
470            }
471            for (key, a) in arr.iter().enumerate() {
472                assert_eq!(map.get(&key), a.as_ref());
473            }
474            for (key, (a, b)) in arr.iter().zip(arr.iter().skip(1)).enumerate() {
475                assert_eq!(
476                    map.get_range_value(&key) == map.get_range_value(&(key + 1)),
477                    a == b
478                );
479            }
480        }
481    }
482
483    #[test]
484    fn test_range_set() {
485        let mut rng = Xorshift::default();
486        const N: usize = 200;
487        const Q: usize = 5000;
488        let mut set: RangeSet<usize> = Default::default();
489        let mut arr = [false; N];
490        for _ in 0..Q {
491            match rng.random(0..5) {
492                0 => {
493                    let key = rng.random(..N);
494                    if let Some(r) = set.get_range(&key) {
495                        arr[r.0..r.1].iter_mut().for_each(|a| {
496                            assert!(*a);
497                        });
498                    };
499                }
500                1 => {
501                    let range = rng.random(Nes(N));
502                    set.drain_with(range, |r| {
503                        arr[r.0.max(range.0)..r.1.min(range.1)]
504                            .iter_mut()
505                            .for_each(|a| {
506                                assert!(*a);
507                                *a = false;
508                            });
509                    });
510                    arr[range.0..range.1].iter_mut().for_each(|a| assert!(!*a));
511                }
512                _ => {
513                    let range = rng.random(Nes(N));
514                    set.insert_with(range, |r| {
515                        arr[r.0.max(range.0)..r.1.min(range.1)]
516                            .iter_mut()
517                            .for_each(|a| {
518                                assert!(*a);
519                                *a = false;
520                            });
521                    });
522                    arr[range.0..range.1].iter_mut().for_each(|a| {
523                        assert!(!*a);
524                        *a = true;
525                    });
526                }
527            }
528            for (key, a) in arr.iter().enumerate() {
529                assert_eq!(set.contains(&key), *a);
530            }
531            for (key, (a, b)) in arr.iter().zip(arr.iter().skip(1)).enumerate() {
532                assert_eq!(set.get_range(&key) == set.get_range(&(key + 1)), a == b,);
533            }
534        }
535    }
536}