#include <bits/stdc++.h>
using
namespace
std;
const
int
INF = 1e9 + 9;
void
dfs(
int
a,
int
par,
int
dep,
vector<vector<
int
> >& v,
vector<
int
>& depth, vector<
int
>& in,
vector<
int
>& out,
vector<pair<
int
,
int
> >& inv,
vector<
int
>& val,
int
& tim)
{
depth[a] = dep;
in[a] = ++tim;
inv[tim] = make_pair(depth[a], val[a]);
for
(
int
i : v[a]) {
if
(i == par)
continue
;
dfs(i, a, dep + 1, v, depth, in,
out, inv, val, tim);
}
out[a] = tim;
}
void
build(
int
node,
int
l,
int
r,
vector<vector<pair<
int
,
int
> > >& segtree,
vector<pair<
int
,
int
> >& inv)
{
if
(l == r) {
segtree[node].push_back(inv[l]);
return
;
}
int
mid = (l + r) >> 1;
build(2 * node + 1, l, mid, segtree, inv);
build(2 * node + 2, mid + 1, r, segtree, inv);
merge(segtree[2 * node + 1].begin(),
segtree[2 * node + 1].end(),
segtree[2 * node + 2].begin(),
segtree[2 * node + 2].end(),
back_inserter(segtree[node]));
int
mn = INF;
for
(
auto
& i : segtree[node]) {
mn = min(mn, i.second);
i.second = mn;
}
}
int
query(
int
x,
int
y,
int
dep,
int
node,
int
l,
int
r,
vector<vector<pair<
int
,
int
> > >& segtree)
{
if
(l > y || r < x || x > y)
return
INF;
if
(x <= l && r <= y) {
auto
it
= upper_bound(segtree[node].begin(),
segtree[node].end(),
make_pair(dep, INF));
if
(it == segtree[node].begin())
return
INF;
it--;
return
it->second;
}
int
mid = (l + r) >> 1;
int
a = query(x, y, dep, 2 * node + 1,
l, mid, segtree);
int
b = query(x, y, dep, 2 * node + 2,
mid + 1, r, segtree);
return
min(a, b);
}
void
answerQueries(vector<pair<
int
,
int
> > queries,
vector<vector<
int
> >& v,
vector<
int
> val,
int
n)
{
int
tim = 0;
vector<
int
> in(n + 10), out(n + 10);
vector<
int
> depth(n + 10);
vector<pair<
int
,
int
> > inv(n + 10);
dfs(1, 0, 0, v, depth, in, out, inv, val, tim);
vector<vector<pair<
int
,
int
> > >
segtree(4 * n + 10);
build(0, 1, tim, segtree, inv);
for
(
auto
& i : queries) {
int
x = i.first;
int
dep = depth[x] + i.second;
int
minVal = query(in[x], out[x], dep, 0,
1, tim, segtree);
cout << minVal << endl;
}
}
int
main()
{
int
n = 5;
vector<vector<
int
> > v(n + 1);
vector<
int
> val(n + 1);
v[1].push_back(4);
v[4].push_back(1);
v[1].push_back(5);
v[5].push_back(1);
v[4].push_back(3);
v[3].push_back(4);
v[3].push_back(2);
v[2].push_back(3);
val[1] = 1;
val[2] = 3;
val[3] = 2;
val[4] = 3;
val[5] = 5;
vector<pair<
int
,
int
> > queries = { { 1, 2 },
{ 2, 1 } };
answerQueries(queries, v, val, n);
return
0;
}