#include <iostream>
#include <vector>
using namespace std;
const int N = 33007;
vector < pair < int, int > > v[N];
vector < int > euler;
int pl[N], h[N], l[N], cst[N], t[N], rl[N][15], rt[N][15], rf[N][15];
int in, n;
void pe_dfs(int nod = 1) {
euler.push_back(nod);
pl[nod] = in++;
for (auto i : v[nod])
h[i.first] = h[nod] + 1, pe_dfs(i.first), euler.push_back(nod);
}
void precalc() {
pe_dfs();
for (int i = 0; i < 15; ++i)
for (int j = (1<<i); j < (1<<(i + 1)) && j < N; ++j)
l[j] = i;
for (int i = 0; i < euler.size(); ++i)
rl[i][0] = euler[i];
for (int i = 1; i <= n; ++i)
rt[i][0] = t[i];
for (int i = 2; i <= n; ++i)
rf[i][0] = cst[i];
for (int p = 1; p < 15; ++p) {
for (int i = 0; i + (1<<p) <= euler.size(); ++i) {
if (h[rl[i][p - 1]] < h[rl[i + (1<<(p - 1))][p - 1]])
rl[i][p] = rl[i][p - 1];
else
rl[i][p] = rl[i + (1<<(p - 1))][p - 1];
}
for (int i = 1; i <= n; ++i)
rt[i][p] = rt[rt[i][p - 1]][p - 1],
rf[i][p] = min(rf[i][p - 1], rf[rt[i][p - 1]][p - 1]);
}
}
int lca(int x, int y) {
if (pl[x] > pl[y])
swap(x, y);
int r(0), pas = 14, ans(0);
return max(rl[pl[x]][l[pl[y] - pl[x] + 1]], rl[pl[y] - (1<<l[pl[y] - pl[x] + 1]) + 1][l[pl[y] - pl[x] + 1]]);
}
int f(int x, int y) {
int r(0), pas = 14, ans(0);
while (pas >= 0) {
if (r + (1<<pas) <= y)
ans = min(ans, rf[x][pas]),
r += (1<<pas),
x = rt[x][pas];
--pas;
}
return ans;
}
int main()
{
int q, p, x, y, a, b, c, d;
cin >> n >> q >> p;
for (int i = 2; i <= n; ++i)
cin >> t[i] >> cst[i],
v[t[i]].push_back({i, cst[i]});
precalc();
cout << '\n';
for (int i = 0; i < euler.size(); ++i)
cout << euler[i] << ' ';
cout << '\n';
for (int i = 1; i <= n; ++i)
cout << h[i] << ' ';
cout << '\n';
cout << pl[3] << ' ' << pl[5] << ' ' << l[pl[5] - pl[3] + 1] << ' ' << rl[2][2] << ' ' << rl[3][2] << '\n';
cout << lca(3, 5) << ' ' << lca(7, 4) << ' ' << lca(6, 7) << '\n';
cout << f(3, 0) << ' ' << f(3, 1) << ' ' << f(3, 2);
return 0;
cin >> x >> y >> a >> b >> c >> d;
while (q--) {
if (x == y) {
if (q < p)
cout << "0\n";
x = (1LL * x * a + 1LL * y * b) % n + 1;
y = 1LL * y * c % n + 1;
continue;
}
int piv = lca(x, y);
int min1 = f(x, h[piv] - h[x]), min2 = f(y, h[piv] - h[y]);
if (q < p)
cout << min(min1, min2) << '\n';
x = (1LL * x * a + 1LL * y * b) % n + 1;
y = (1LL * y * c + 1LL * min(min1, min2) * d) % n + 1;
}
return 0;
}