|
5 | 5 | /// use programming_team_code_rust::data_structures::rmq::RMQ; |
6 | 6 | /// |
7 | 7 | /// let a = [1, 3, 2, 4, 5]; |
8 | | -/// let rmq = RMQ::new(&a, std::cmp::min); |
9 | | -/// assert_eq!(rmq.query(0..5), 1); |
10 | | -/// assert_eq!(rmq.query(1..4), 2); |
| 8 | +/// let rmq1 = RMQ::new(&a, std::cmp::min); |
| 9 | +/// assert_eq!(rmq1.query(0..5), 1); |
| 10 | +/// assert_eq!(rmq1.query(1..4), 2); |
| 11 | +/// |
| 12 | +/// let outside_var = 5; |
| 13 | +/// let rmq2 = RMQ::new(&a, |x, y| if x + outside_var < y + outside_var { x } else { y }); |
| 14 | +/// assert_eq!(rmq2.query(0..5), 1); |
| 15 | +/// assert_eq!(rmq2.query(1..4), 2); |
11 | 16 | /// ``` |
12 | | -pub struct RMQ<T> { |
| 17 | +pub struct RMQ<T, F> { |
13 | 18 | t: Vec<Vec<T>>, |
14 | | - op: fn(T, T) -> T, |
| 19 | + op: F, |
15 | 20 | } |
16 | 21 |
|
17 | | -impl<T: Copy> RMQ<T> { |
| 22 | +impl<T: Copy, F: Fn(T, T) -> T> RMQ<T, F> { |
18 | 23 | /// Create a new RMQ instance |
19 | 24 | /// |
20 | 25 | /// # Complexity (n = a.len()) |
21 | 26 | /// - Time: O(n log n) |
22 | 27 | /// - Space: O(n log n) |
23 | | - pub fn new(a: &[T], op: fn(T, T) -> T) -> Self { |
| 28 | + pub fn new(a: &[T], op: F) -> Self { |
24 | 29 | let mut t = vec![a.to_owned(); 1]; |
25 | 30 | let mut i = 0; |
26 | 31 | while (2 << i) <= a.len() { |
|
0 commit comments