using
System;
public
class
GFG {
class
Node {
public
int
val;
public
Node left, right;
public
Node(
int
x)
{
val = x;
left = right =
null
;
}
}
static
void
dfs(Node cur, Node parent,
int
[, ] par)
{
if
(cur ==
null
)
return
;
par[0, cur.val] = parent.val;
dfs(cur.left, cur, par);
dfs(cur.right, cur, par);
}
static
int
findKlevelup(
int
u,
int
k,
int
[, ] par)
{
for
(
int
i = 0; i < 19; i++) {
if
(((k >> i) & 1) > 0)
u = par[i, u];
}
return
(u > 0 ? u : -1);
}
static
void
solve(
int
n,
int
q,
int
[, ] queries,
Node root)
{
int
[, ] par =
new
int
[20, 20];
par[0, root.val] = 0;
dfs(root.left, root, par);
dfs(root.right, root, par);
for
(
int
i = 1; i <= 18; i++) {
for
(
int
j = 1; j <= n; j++)
par[i, j] = par[i - 1, par[i - 1, j]];
}
for
(
int
i = 0; i < q; i++) {
int
u, k;
u = queries[i, 0];
k = queries[i, 1];
int
ans = findKlevelup(u, k, par);
Console.Write(ans +
" "
);
}
}
static
public
void
Main()
{
int
N = 5;
int
Q = 3;
Node root =
new
Node(1);
root.left =
new
Node(2);
root.right =
new
Node(3);
root.right.left =
new
Node(4);
root.right.right =
new
Node(5);
int
[, ] queries = { { 4, 1 }, { 4, 2 }, { 4, 3 } };
solve(N, Q, queries, root);
}
}