Skip to content

Commit 2d52519

Browse files
authored
Create 1938-maximum-genetic-difference-query.js
1 parent 423d2e1 commit 2d52519

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* @param {number[]} parents
3+
* @param {number[][]} queries
4+
* @return {number[]}
5+
*/
6+
const maxGeneticDifference = function (parents, queries) {
7+
let pn = parents.length,
8+
qn = queries.length
9+
let root = parents.indexOf(-1)
10+
let children = initializeGraph(pn)
11+
for (let i = 0; i < pn; i++) {
12+
if (i != root) {
13+
children[parents[i]].push(i)
14+
}
15+
}
16+
let freq = Array(1 << 20).fill(0)
17+
let queriesByNode = initializeGraph(pn)
18+
for (let i = 0; i < qn; i++) {
19+
let query = queries[i]
20+
queriesByNode[query[0]].push(new Query(i, query[1]))
21+
}
22+
23+
let res = Array(qn).fill(0)
24+
const dfs = (idx) => {
25+
let y = (1 << 19) + idx
26+
while (y > 0) {
27+
freq[y]++
28+
y >>= 1
29+
}
30+
for (const qnode of queriesByNode[idx]) {
31+
let j = qnode.index,
32+
x = qnode.val
33+
let cum = 0
34+
let bit = 1 << 18
35+
while (bit > 0) {
36+
let ii = (((1 << 19) ^ cum ^ x ^ bit) / bit) >> 0
37+
if (freq[ii] > 0) cum += bit
38+
bit >>= 1
39+
}
40+
res[j] = cum
41+
}
42+
for (const child of children[idx]) dfs(child)
43+
y = (1 << 19) + idx
44+
while (y > 0) {
45+
freq[y]--
46+
y >>= 1
47+
}
48+
}
49+
dfs(root)
50+
return res
51+
}
52+
53+
const initializeGraph = (n) => {
54+
let G = []
55+
for (let i = 0; i < n; i++) G.push([])
56+
return G
57+
}
58+
59+
function Query(index, val) {
60+
this.index = index
61+
this.val = val
62+
}

0 commit comments

Comments
 (0)