#include <bits/stdc++.h>   #pragma optimize( Ofast )   using namespace std;   using ll = long long int;   using ull = unsigned long long int;   using dd = double;   using ldd = long double;   using si = short int;   using pii = pair<int, int>;   using pll = pair<ll, ll>;   int _size = 1 << 20;   vector<ll> tree(_size << 1), cnt(_size << 1);   vector<ll> pos;   vector<ll> x;   vector<ll> price;   vector<ll> if_now;   vector<ll> to_pay;   vector<vector<pll>> gr;   vector<ll> ans;   int n;   void upd(int v, ll cn) {     ll c = cn;     cn *= price[v];     v = pos[v];     v += _size;     cnt[v] += c;     tree[v] += cn;     v >>= 1;     while (v) {       tree[v] += cn;       cnt[v] += c;       v >>= 1;     }   }   int find_f(ll t, int v = 1) {     if (v >= _size) return v - _size;     if (tree[v << 1] > t)       return find_f(t, v << 1);     else       return find_f(t - tree[v << 1], v << 1 | 1);   }   ll get_cnt(ll rr, int v = 1, int l = 0, int r = _size) {     if (r <= rr) return cnt[v];     if (l >= rr) return 0;     return get_cnt(rr, v << 1, l, (r + l) >> 1) +            get_cnt(rr, v << 1 | 1, (r + l) >> 1, r);   }   ll get_pay(ll rr, int v = 1, int l = 0, int r = _size) {     if (r <= rr) return tree[v];     if (l >= rr || r <= l) return 0;     return get_pay(rr, v << 1, l, (r + l) >> 1) +            get_pay(rr, v << 1 | 1, (r + l) >> 1, r);   }   ll get_now(ll t) {     0;     if (t >= tree[1]) {       return get_cnt(_size);     }     0;     int ind = find_f(t);     0;     ll ans = get_cnt(ind);     0;     t -= get_pay(ind);     0;     if (ind >= to_pay.size() || to_pay[ind] == 0) {       return ans;     }     return ans + t / to_pay[ind];   }   void dfs(int v, ll t) {     0;     upd(v, x[v]);     0;     if_now[v] = get_now(t);     0;     for (pll i : gr[v]) {       t -= i.second * 2;       if (t >= 0) dfs(i.first, t);       t += i.second * 2;     }     upd(v, -x[v]);   }   void afs(int v) {     ans[v] = if_now[v];     vector<ll> ch;     for (pii i : gr[v]) {       afs(i.first);       ch.push_back(ans[i.first]);     }     sort((ch).begin(), (ch).end());     reverse((ch).begin(), (ch).end());     ans[v] = max(ans[v], (ch.size() >= 2 ? ch[1] : 0));   }   int main() {     ios_base::sync_with_stdio(0);     cout.tie(0);     cin.tie(0);     ll t;     cin >> n >> t;     x.resize(n);     pos.resize(n);     price.resize(n);     if_now.resize(n);     gr.resize(n);     to_pay.resize(n);     ans.resize(n);     for (int i = 0; i < n; ++i) cin >> x[i];     map<ll, ll> ttt;     int s = 0;     for (int i = 0; i < n; ++i) {       cin >> price[i];       ttt[price[i]] = 0;     }     for (auto& i : ttt) {       i.second = s;       to_pay[s] = i.first;       ++s;     }     0;     for (int i = 0; i < n; ++i) pos[i] = ttt[price[i]];     0;     vector<pair<ll, ll>> tt;     for (int i = 0; i < n - 1; ++i) {       ll a, b;       cin >> a >> b;       tt.push_back({a, b});       gr[a - 1].push_back({i + 1, b});     }     0;     dfs(0, t);     0;     0;     afs(0);     0;     for (pll i : gr[0]) {       ans[0] = max(ans[0], ans[i.first]);     }     cout << ans[0];   }   