|
| 1 | +// Maximum Genetic Difference Query |
| 2 | +impl Solution { |
| 3 | + pub fn max_genetic_difference(parents: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<i32> { |
| 4 | + const LN: usize = 18; |
| 5 | + fn dfs(u: usize, dep: i32, fenwick: &mut Vec<i32>, g: &Vec<Vec<usize>>, q: &Vec<Vec<(i32, usize)>>, ans: &mut Vec<i32>) { |
| 6 | + let mut x = u; |
| 7 | + while x < 1<<LN { fenwick[x] += 1; x |= x+1; } |
| 8 | + for qu in q[u].iter() { |
| 9 | + let mut c = dep; |
| 10 | + x = 0; |
| 11 | + for i in (0..LN).rev().map(|i| 1<<i) { |
| 12 | + let c1 = fenwick[x+i-1]; |
| 13 | + if c1 < c && ((qu.0 & i as i32) == 0 || c1 == 0) { |
| 14 | + c -= c1; |
| 15 | + x += i; |
| 16 | + } else { |
| 17 | + c = c1 |
| 18 | + } |
| 19 | + } |
| 20 | + ans[qu.1] = qu.0 ^ x as i32; |
| 21 | + } |
| 22 | + for &v in g[u].iter() { |
| 23 | + dfs(v, dep+1, fenwick, g, q, ans); |
| 24 | + } |
| 25 | + x = u; |
| 26 | + while x < 1<<LN { fenwick[x] -= 1; x |= x+1; } |
| 27 | + } |
| 28 | + |
| 29 | + let n = parents.len(); |
| 30 | + let mut root = 0; |
| 31 | + let mut g = vec![vec![]; n]; |
| 32 | + let mut q = vec![vec![]; n]; |
| 33 | + for (i, p) in parents.into_iter().enumerate() { |
| 34 | + if p == -1 { root = i; } |
| 35 | + else { g[p as usize].push(i as usize); } |
| 36 | + } |
| 37 | + for (i, que) in queries.iter().enumerate() { |
| 38 | + q[que[0] as usize].push((que[1], i)); |
| 39 | + } |
| 40 | + let mut fenwick = vec![0; 1<<LN]; |
| 41 | + let mut ans = vec![0; queries.len()]; |
| 42 | + dfs(root, 1, &mut fenwick, &g, &q, &mut ans); |
| 43 | + ans |
| 44 | + } |
| 45 | +} |
0 commit comments