#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include #include using namespace atcoder; using namespace std; #define rep(i, a, n) for(ll i = a; i < n; i++) #define rrep(i, a, n) for(ll i = a; i >= n; i--) #define inr(l, x, r) (l <= x && x < r) #define ll long long #define ld long double #define pii pair #define pll pair #define all(x) (x).begin(), (x).end() //constexpr ll MOD = 1000000007; constexpr ll MOD = 998244353; constexpr int IINF = 1001001001; constexpr ll INF = 1LL<<60; template void chmax(t&a,u b){if(a void chmin(t&a,u b){if(b> n >> x; vector p(n), c(n,0), s(n,0); ll sum = 0, sum2 = 0; vector> g(n); rep(i,1,n) cin >> p[i], p[i]--; rep(i,1,n) g[p[i]].push_back(i); rep(i,1,n) cin >> c[i] >> s[i], sum += s[i], sum2 += c[i]; ll px = sum-x+1; vector> dp(n); auto dfs = [&](auto& self, int v) -> pll { vector use = {0}; pll ss = {c[v], s[v]}; for(auto nv : g[v]){ auto [nc, ns] = self(self, nv); ss.first += nc; ss.second += ns; vector nuse(min((ll)(use.size()+dp[nv].size()-1),px+1), -INF); rep(i,0,use.size()) rep(j,0,dp[nv].size()){ if(i + j > px) break; chmax(nuse[i+j], use[i] + dp[nv][j]); } use = nuse; } chmin(ss.second,px); while(ss.second >= use.size()) use.push_back(-INF); use[ss.second] = max(use[ss.second], ss.first); dp[v] = use; return ss; }; dfs(dfs,0); ll ans = INF; rep(i,0,dp[0].size()){ if(i < px && dp[0][i] >= 0) chmin(ans, sum2 - dp[0][i]); // cout << px << " " << i << " " << dp[0][i] << " " << sum2 - dp[0][i] << endl; } // rep(i,0,n){ // for(auto xx: dp[i]) cout << xx << " "; // cout << endl; // } cout << ans << endl; return 0; }