competitive/data_structure/
kdtree.rs1use std::ops::Range;
2
3pub struct Static2DTree<T, U, V>
4where
5 T: Ord,
6 U: Ord,
7{
8 data: Vec<(T, U, V)>,
9}
10impl<T, U, V> Static2DTree<T, U, V>
11where
12 T: Ord,
13 U: Ord,
14{
15 pub fn new<I>(data: I) -> Self
16 where
17 I: IntoIterator<Item = (T, U, V)>,
18 {
19 let mut data: Vec<_> = data.into_iter().collect();
20 let n = data.len();
21 Self::build(&mut data, 0, n, 0);
22 Self { data }
23 }
24 fn build(data: &mut [(T, U, V)], l: usize, r: usize, depth: usize) {
25 if l < r {
26 let m = l + (r - l) / 2;
27 if depth % 2 == 0 {
28 data[l..r].sort_by(|p, q| p.0.cmp(&q.0));
29 } else {
30 data[l..r].sort_by(|p, q| p.1.cmp(&q.1));
31 }
32 Self::build(data, l, m, depth + 1);
33 Self::build(data, m + 1, r, depth + 1);
34 }
35 }
36 pub fn range(&self, range1: Range<T>, range2: Range<U>) -> Vec<&V> {
37 let mut res = vec![];
38 self.range_inner(&range1, &range2, 0, self.data.len(), 0, &mut res);
39 res
40 }
41 fn range_inner<'a>(
42 &'a self,
43 range1: &Range<T>,
44 range2: &Range<U>,
45 l: usize,
46 r: usize,
47 depth: usize,
48 res: &mut Vec<&'a V>,
49 ) {
50 if l < r {
51 let m = l + (r - l) / 2;
52 let (t, u, v) = &self.data[m];
53 if range1.contains(t) && range2.contains(u) {
54 res.push(v);
55 }
56 if if depth % 2 == 0 {
57 &range1.start <= t
58 } else {
59 &range2.start <= u
60 } {
61 self.range_inner(range1, range2, l, m, depth + 1, res);
62 }
63 if if depth % 2 == 0 {
64 t < &range1.end
65 } else {
66 u < &range2.end
67 } {
68 self.range_inner(range1, range2, m + 1, r, depth + 1, res);
69 }
70 }
71 }
72}