#include using namespace std; #include using namespace atcoder; template using vc = vector; template using vv = vc>; //-------------1.型系--------------- using ll = long long; ll INF = 2e18; using ld = long double; using bl = bool; using mint = modint998244353; // using mint = modint1000000007; // using mint = modint; // mint::set_mod(m); template using pq = priority_queue>; template using pq_g = priority_queue, greater>; //----------------------------------- //-------------2.配列系-------------- using pii = pair; using pll = pair; #define rep(i, n) for (ll i = 0; i < (n); ++i) template istream& operator>>(istream& i, vc& v) { rep(j, size(v)) i >> v[j]; return i; } using ar2 = array; //---------------------------------- //--------3.コード短縮化とか--------- const double PI = 3.141592653589793238; const int inf = 1073741823; const ll infl = 1LL << 60; const string ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const string abc = "abcdefghijklmnopqrstuvwxyz"; #define rep(i, n) for (ll i = 0; i < (n); ++i) #define drep(i, n) for (ll i = (n) - 1; i >= 0; --i) #define nfor(i, s, n) for (ll i = s; i < n; i++) #define dfor(i, s, n) for (ll i = (s) - 1; i >= n; i--) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define chmax(x, y) x = max(x, y) #define chmin(x, y) x = min(x, y) #define Yes cout << "Yes" << endl #define No cout << "No" << endl #define YN \ { \ cout << "Yes" << endl; \ } \ else { \ cout << "No" << endl; \ } // if(a==b)YN; #define vc_unique(v) v.erase(unique(v.begin(), v.end()), v.end()); #define vc_rotate(v) rotate(v.begin(), v.begin() + 1, v.end()); #define pop_cnt(s) ll(popcount(uint64_t(s))) #define next_p(v) next_permutation(v.begin(), v.end()) //------------------------------- //---------4.グリッド系---------- vector dx = {1, 0, -1, 0}; // dx={1,1,0,-1,-1,-1,0,1}; vector dy = {0, 1, 0, -1}; // dy={0,1,1,1,0,-1,-1,-1}; bool out_grid(ll i, ll j, ll h, ll w = -1) { if (w == -1) { w = h; } return (!(0 <= i && i < h && 0 <= j && j < w)); } #define vvl_rotate(v) \ { \ ll n = size(v); \ vvl nx(n, vl(n)); \ rep(i, n) rep(j, n) nx[j][n - i - 1] = v[i][j]; \ swap(nx, v); \ } // 時計回りに90°回転 // #define vvl_rotate(v) {ll n = size(v);vvl // nx(n,vl(n));rep(i,n)rep(j,n)nx[n-j-1][i]=v[i][j];swap(nx,v);}//反時計周りに90°回転 #define vs_rotate(v) \ { \ ll n = size(v); \ vs nx(n, string(n, '.')); \ rep(i, n) rep(j, n) nx[j][n - i - 1] = v[i][j]; \ swap(nx, v); \ } // 文字列版 時計回りに90°回転 // #define vs_rotate(v) {ll n = size(v);vs // nx(n,string(n,'.'));rep(i,n)rep(j,n)nx[n-j-1][i]=v[i][j];swap(nx,v);}//文字列版 反時計周りに90°回転 #define vvl_transpos(v) \ { \ ll n = size(v); \ vvl nx(n, vl(n)); \ rep(i, n) rep(j, n) nx[j][i] = v[i][j]; \ swap(nx, v); \ } #define vs_transpos(v) \ { \ ll n = size(v); \ vs nx(n, string(n, '.')); \ rep(i, n) rep(j, n) nx[j][i] = v[i][j]; \ swap(nx, v); \ } //-------------------------------- //-----------5.数学系-------------- #define euclid(x, y) ((x) * (x) + (y) * (y)) // ユークリッド距離 2乗のまま #define manhattan(x1, x2, y1, y2) \ (abs(x1 - x2) + abs(y1 - y2)) // マンハッタン距離 = |x1-x2|+|y1-y2| template T tousa_sum1(T l, T d, T r) { // 初項,公差,末項 で総和を求める T wide = (r - l) / d + 1; return (l + r) * wide / 2; } template T tousa_sum2(T a, T d, T n) { // 初項,交差,項数 で総和を求める return (a * 2 + d * (n - 1)) * n / 2; } ll kousa_kousuu(ll l, ll r, ll d) { // 初項,末項,交差 で等差数列の項数を求める return (r - l) / d + 1; } mint touhi_sum(mint a, mint r, ll n) { // 初項,公比,項数で等比数列の総和を求める if (r == 1) { return a * n; } mint bunsi = a * (r.pow(n) - mint(1)); mint bunbo = r - 1; return bunsi / bunbo; } ll nc2(ll x) { return x * (x - 1) / 2; } ll nc3(ll x) { return x * (x - 1) * (x - 2) / 6; } //---------------------------------------------- //-----------6.デバックや出力系------------------ void print(ld x) { printf("%.20Lf\n", x); } #define print_vec(v) \ { \ ll n = size(v); \ rep(i, n) cout << v[i] << " "; \ cout << endl; \ } // 一次元配列を出力する(改行なし) #define vc_cout(v) \ { \ ll n = size(v); \ rep(i, n) cout << v[i] << endl; \ } // 一次元配列を出力する(改行あり) #define vv_cout(v) \ { \ ll n = size(v); \ rep(i, n) { \ rep(j, size(v[i])) { cout << v[i][j] << ' '; } \ cout << endl; \ } \ } // 二次元配列を出力する //---------------------------------------------- int n, x; vector> G(2009); vector c(2009), s(2009); vector f(int u, vector dp) { vector ndp(x + 1, infl); rep(i, x + 1 - s[u]) chmin(ndp[i + s[u]], dp[i] + c[u]); for (auto v : G[u]) { vector res = f(v, ndp); rep(i, x + 1) chmin(ndp[i], res[i]); } return ndp; } int main() { ios::sync_with_stdio(false); std::cin.tie(nullptr); cout << fixed << setprecision(10); cin >> n >> x; nfor(i, 1, n) { int p; cin >> p, p--; G[p].push_back(i); } nfor(i, 1, n) cin >> c[i] >> s[i]; vector dp(x + 1, infl); dp[0] = 0; cout << f(0, dp)[x] << endl; return 0; }