#include using namespace std; using ll = long long; template istream& operator >> (istream& is, vector& vec) { for(T& x : vec) is >> x; return is; } template ostream& operator << (ostream& os, const vector& vec) { if(vec.empty()) return os; os << vec[0]; for(auto it = vec.begin(); ++it != vec.end(); ) os << ' ' << *it; return os; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, x; cin >> n >> x; vector> g(n); for(int i = 1; i < n; i++){ int p; cin >> p; g[p - 1].emplace_back(i); } vector> a(n); for(int i = 1; i < n; i++){ auto &&[c, s] = a[i]; cin >> c >> s; } vector> dp(n); auto dfs = [&](auto dfs, int v) -> void { auto&& tmp = dp[v]; tmp.resize(1, 0); for(auto u : g[v]){ dfs(dfs, u); auto [c, s] = a[u]; int m = tmp.size() + s + dp[u].size() - 1; vector ndp(m, 1ll << 60); for(int i = 0; i < tmp.size(); i++){ ndp[i] = min(ndp[i], tmp[i]); for(int j = 0; i + j + s < m && j < dp[u].size(); j++){ ndp[i + j + s] = min(ndp[i + j + s], tmp[i] + dp[u][j] + c); } } swap(ndp, tmp); } for(int i = tmp.size() - 1; i >= 1; i--) tmp[i - 1] = min(tmp[i - 1], tmp[i]); }; dfs(dfs, 0); cout << dp[0][x] << '\n'; }