competitive_hpp/utils/
btree.rs1use std::collections::{BTreeMap, BTreeSet};
2
3pub trait BTreeMapUtils<T, U> {
4 fn min_elem(&self) -> Option<(&T, &U)>;
5 fn max_elem(&self) -> Option<(&T, &U)>;
6}
7
8impl<T, U> BTreeMapUtils<T, U> for BTreeMap<T, U> {
9 fn min_elem(&self) -> Option<(&T, &U)> {
10 self.iter().next()
11 }
12 fn max_elem(&self) -> Option<(&T, &U)> {
13 self.iter().next_back()
14 }
15}
16
17pub trait BTreeSetUtils<T> {
18 fn min_elem(&self) -> Option<&T>;
19 fn max_elem(&self) -> Option<&T>;
20}
21
22impl<T> BTreeSetUtils<T> for BTreeSet<T> {
23 fn min_elem(&self) -> Option<&T> {
24 self.iter().next()
25 }
26 fn max_elem(&self) -> Option<&T> {
27 self.iter().next_back()
28 }
29}
30
31#[cfg(test)]
32mod test {
33 use super::*;
34
35 #[test]
36 fn btree_map_test() {
37 let tree: BTreeMap<i32, i32> = maplit::btreemap! { 1 => 1, 3 => 3, 2 => 2 };
38
39 assert_eq!(tree.min_elem(), Some((&1, &1)));
40 assert_eq!(tree.max_elem(), Some((&3, &3)));
41 }
42
43 #[test]
44 fn btree_set_test() {
45 let set: BTreeSet<i32> = maplit::btreeset! { 1, 3, 2 };
46
47 assert_eq!(set.min_elem(), Some(&1));
48 assert_eq!(set.max_elem(), Some(&3));
49 }
50}