#include using namespace std; using ll = long long; int main () { int N, X; cin >> N >>X; std::vector P(N); for (int i = 1; i < N; i ++) { cin >> P[i]; P[i] --; } P[0] = -1; vector> gr(N); for (int i = 1; i < N; i ++) { gr[P[i]].push_back(i); } vector C(N, 0), S(N, 0); for (int i = 1; i < N; i ++) { cin >> C[i] >> S[i]; } int ss = accumulate(S.begin(), S.end(), 0); vector dp(N, vector(ss + 1, (ll)1e18)); vector siz(N, 0); vector nxt; for (int u = N-1; u >= 0; u --) { dp[u][0] = 0; for (int i = 1; i <= S[u]; i ++) dp[u][i] = C[u]; siz[u] = S[u] + 1; nxt = dp[u]; for (int v : gr[u]) { for (int i = S[u]; i < siz[u]; i ++) { for (int j = S[v]; j < siz[v]; j ++) { nxt[i + j] = min(nxt[i + j], dp[u][i] + dp[u][j]); } } for (int i = siz[u] + siz[v] - 1; i >= 0; i --) { nxt[i] = min(nxt[i], nxt[i+1]); } swap(dp[u], nxt); siz[u] = siz[u] + siz[v] - 1; } } cout << dp[0][X] << endl; }