55/// use programming_team_code_rust::data_structures::rmq::RMQ;
66///
77/// let a = [1, 3, 2, 4, 5];
8- /// let rmq1 = RMQ::new(&a, std::cmp::min);
8+ /// let rmq1 = RMQ::new(&a, |&x, &y| std::cmp::min(x, y) );
99/// assert_eq!(rmq1.query(0..5), 1);
1010/// assert_eq!(rmq1.query(1..4), 2);
1111///
1212/// let outside_var = 5;
13- /// let rmq2 = RMQ::new(&a, |x, y| if x + outside_var < y + outside_var { x } else { y });
13+ /// let rmq2 = RMQ::new(&a, |& x, & y| if x + outside_var < y + outside_var { x } else { y });
1414/// assert_eq!(rmq2.query(0..5), 1);
1515/// assert_eq!(rmq2.query(1..4), 2);
1616/// ```
@@ -19,19 +19,19 @@ pub struct RMQ<T, F> {
1919 op : F ,
2020}
2121
22- impl < T : Copy , F : Fn ( T , T ) -> T > RMQ < T , F > {
22+ impl < T : Clone , F : Fn ( & T , & T ) -> T > RMQ < T , F > {
2323 /// Create a new RMQ instance
2424 ///
2525 /// # Complexity (n = a.len())
2626 /// - Time: O(n log n)
2727 /// - Space: O(n log n)
2828 pub fn new ( a : & [ T ] , op : F ) -> Self {
29- let mut t = vec ! [ a. to_owned ( ) ; 1 ] ;
29+ let mut t = vec ! [ a. to_vec ( ) ; 1 ] ;
3030 let mut i = 0 ;
3131 while ( 2 << i) <= a. len ( ) {
3232 t. push (
3333 ( 0 ..t[ i] . len ( ) - ( 1 << i) )
34- . map ( |j| op ( t[ i] [ j] , t[ i] [ j + ( 1 << i) ] ) )
34+ . map ( |j| op ( & t[ i] [ j] , & t[ i] [ j + ( 1 << i) ] ) )
3535 . collect ( ) ,
3636 ) ;
3737 i += 1 ;
@@ -46,6 +46,6 @@ impl<T: Copy, F: Fn(T, T) -> T> RMQ<T, F> {
4646 /// - Space: O(1)
4747 pub fn query ( & self , range : std:: ops:: Range < usize > ) -> T {
4848 let lg = range. len ( ) . ilog2 ( ) as usize ;
49- ( self . op ) ( self . t [ lg] [ range. start ] , self . t [ lg] [ range. end - ( 1 << lg) ] )
49+ ( self . op ) ( & self . t [ lg] [ range. start ] , & self . t [ lg] [ range. end - ( 1 << lg) ] )
5050 }
5151}
0 commit comments