给定一棵以节点 0 为根的无向树,带有 n
个节点,按 0 到 n - 1
编号。每个节点 i
有一个整数值 vals[i]
,并且它的父节点通过 par[i]
给出。
从根节点 0 到节点 u
的 路径异或和 定义为从根节点到节点 u
的路径上所有节点 i
的 vals[i]
的按位异或,包括节点 u
。
给定一个 2 维整数数组 queries
,其中 queries[j] = [uj, kj]
。对于每个查询,找到以 uj
为根的子树的所有节点中,第 kj
小 的 不同 路径异或和。如果子树中 不同 的异或路径和少于 kj
,答案为 -1。
返回一个整数数组,其中第 j
个元素是第 j
个查询的答案。
在有根树中,节点 v
的子树包括 v
以及所有经过 v
到达根节点路径上的节点,即 v
及其后代节点。
示例 1:
输入:par = [-1,0,0], vals = [1,1,1], queries = [[0,1],[0,2],[0,3]]
输出:[0,1,-1]
解释:
路径异或值:
1
1 XOR 1 = 0
1 XOR 1 = 0
0 的子树:以节点 0 为根的子树包括节点 [0, 1, 2]
,路径异或值为 [1, 0, 0]
。不同的异或值为 [0, 1]
。
查询:
queries[0] = [0, 1]
:节点 0 的子树中第 1 小的不同路径异或值为 0。queries[1] = [0, 2]
:节点 0 的子树中第 2 小的不同路径异或值为 1。queries[2] = [0, 3]
:由于子树中只有两个不同路径异或值,答案为 -1。输出:[0, 1, -1]
示例 2:
输入:par = [-1,0,1], vals = [5,2,7], queries = [[0,1],[1,2],[1,3],[2,1]]
输出:[0,7,-1,0]
解释:
路径异或值:
5
5 XOR 2 = 7
5 XOR 2 XOR 7 = 0
子树与不同路径异或值:
[0, 1, 2]
,路径异或值为 [5, 7, 0]
。不同的异或值为 [0, 5, 7]
。[1, 2]
,路径异或值为 [7, 0]
。不同的异或值为 [0, 7]
。[2]
,路径异或值为 [0]
。不同的异或值为 [0]
。查询:
queries[0] = [0, 1]
:节点 0 的子树中,第 1 小的不同路径异或值为 0。queries[1] = [1, 2]
:节点 1 的子树中,第 2 小的不同路径异或值为 7。queries[2] = [1, 3]
:由于子树中只有两个不同路径异或值,答案为 -1。queries[3] = [2, 1]
:节点 2 的子树中,第 1 小的不同路径异或值为 0。输出:[0, 7, -1, 0]
提示:
1 <= n == vals.length <= 5 * 104
0 <= vals[i] <= 105
par.length == n
par[0] == -1
[1, n - 1]
中的 i
,0 <= par[i] < n
1 <= queries.length <= 5 * 104
queries[j] == [uj, kj]
0 <= uj < n
1 <= kj <= n
par
表示一棵合法的树。