#include <bits/stdc++.h>   using namespace std;   struct segTree {     long long* data;     int n;     segTree(int n) : n(n) { data = new long long[n * 2](); }     void add(int i, long long v) {       for (i += n; i; i >>= 1) data[i] += v;     }     int find(long long v) {       int i = 1;       while (i < n) {         i *= 2;         if (v >= data[i]) v -= data[i++];       }       return i - n;     }     long long sum(int i) {       long long r = data[i + n];       for (i += n; i > 1; i >>= 1) {         if (i & 1) r += data[i - 1];       }       return r;     }   };   segTree count_tree(1 << 17), sum_tree(1 << 17);   long long x[100000], t[100000];   vector<pair<int, long long>> child[100000];   map<int, int> ti_map;   int ti_list[100000];   long long dp[100000], dp2[100000];   void dfs(int p, long long T) {     if (T <= 0) return;     count_tree.add(ti_map[t[p]], x[p]);     sum_tree.add(ti_map[t[p]], x[p] * t[p]);     int i = sum_tree.find(T);     dp[p] = count_tree.sum(i - 1);     assert(sum_tree.sum(i - 1) <= T);     assert(i >= 1e5 + 10 || sum_tree.sum(i) > T);     if (i < 1e5 + 10) dp[p] += (T - sum_tree.sum(i - 1)) / ti_list[i];     vector<long long> child_vals;     for (auto e : child[p]) {       dfs(e.first, T - e.second * 2);       child_vals.push_back(dp2[e.first]);     }     sort(child_vals.rbegin(), child_vals.rend());     dp2[p] = dp[p];     if (child_vals.size() >= 2) dp2[p] = max(dp2[p], child_vals[1]);     if (p == 0) dp2[p] = max(dp2[p], child_vals[0]);     count_tree.add(ti_map[t[p]], -x[p]);     sum_tree.add(ti_map[t[p]], -x[p] * t[p]);   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     long long n, T;     cin >> n >> T;     for (int i = 0; i < n; i++) cin >> x[i];     for (int i = 0; i < n; i++) {       cin >> t[i];       ti_map[t[i]];     }     int c = 1;     for (auto& p : ti_map) {       ti_list[c] = p.first;       p.second = c++;     }     for (int i = 1; i < n; i++) {       long long p, l;       cin >> p >> l;       child[p - 1].push_back({i, l});     }     dfs(0, T);     cout << dp2[0] << endl;   }   