File tree Expand file tree Collapse file tree 1 file changed +62
-0
lines changed Expand file tree Collapse file tree 1 file changed +62
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments