1
1
//! # Linear Range Minimum Query
2
2
3
+ /// # Example
4
+ /// ```
5
+ /// use programming_team_code_rust::data_structures::linear_rmq::LinearRMQ;
6
+ ///
7
+ /// let a = [1, 0, 2, 0, 3];
8
+ /// let rmq = LinearRMQ::new(&a, |&x, &y| x.lt(&y)); // lt -> right-most min
9
+ /// // le -> left-most min
10
+ /// // gt -> right-most max
11
+ /// // ge -> left-most max
12
+ /// assert_eq!(rmq.query_idx(0..5), 3);
13
+ /// assert_eq!(*rmq.query(1..5), 0);
14
+ /// ```
3
15
pub struct LinearRMQ < T , F > {
4
16
a : Vec < T > ,
5
17
cmp : F ,
@@ -8,6 +20,11 @@ pub struct LinearRMQ<T, F> {
8
20
}
9
21
10
22
impl < T : Clone , F : Fn ( & T , & T ) -> bool > LinearRMQ < T , F > {
23
+ /// Create a new LinearRMQ instance
24
+ ///
25
+ /// # Complexity (n = a.len())
26
+ /// - Time: O(n)
27
+ /// - Space: O(n)
11
28
pub fn new ( a : & [ T ] , cmp : F ) -> Self {
12
29
let mut head = vec ! [ 0 ; a. len( ) + 1 ] ;
13
30
let mut t = vec ! [ ( 0 , 0 ) ; a. len( ) ] ;
@@ -43,6 +60,11 @@ impl<T: Clone, F: Fn(&T, &T) -> bool> LinearRMQ<T, F> {
43
60
}
44
61
}
45
62
63
+ /// Gets the index of min/max of range
64
+ ///
65
+ /// # Complexity
66
+ /// - Time: O(1)
67
+ /// - Space: O(1)
46
68
pub fn query_idx ( & self , range : std:: ops:: Range < usize > ) -> usize {
47
69
assert ! ( !range. is_empty( ) ) ;
48
70
let ( mut le, mut ri) = ( range. start , range. end - 1 ) ;
@@ -70,6 +92,11 @@ impl<T: Clone, F: Fn(&T, &T) -> bool> LinearRMQ<T, F> {
70
92
}
71
93
}
72
94
95
+ /// Gets the min/max of range
96
+ ///
97
+ /// # Complexity
98
+ /// - Time: O(1)
99
+ /// - Space: O(1)
73
100
pub fn query ( & self , range : std:: ops:: Range < usize > ) -> & T {
74
101
& self . a [ self . query_idx ( range) ]
75
102
}
0 commit comments