5
27468 7465 74275 40573 40155
112071 76270 244461 264202 132397
1 777133331
2 107454154
3 652330694
4 792720519
 5
78188 56310 79021 70050 65217
115040 5149 128449 98357 36580
1 451393770
2 574046602
3 590130784
4 112514248
 7
1 1 1 1 1 1 1
1 3000000000 3000000000 3000000000 1000000000 1000000000 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
 10
2 8 6 1 2 7 6 9 2 8
4 9 4 3 5 2 9 3 7 3
1 8
2 8
3 8
4 10
5 1
6 4
7 3
8 10
9 2
 11
1 1 1 1 1 1 1 1 1 1 1
1 1000000001 1000000001 1000000001 1000000001 1000000001 1000000001 1000000001 1000000001 1000000001 1000000001
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
1 1000000000
 5
2 1 1 2 3
1 2 2 2 1
1 2
1 3
2 4
1 4

NO
 NO
 NO
 YES
 NO
 NO

#include <bits/stdc++.h>
using namespace std;
template <class T>
void read(T& x) {
  cin >> x;
}
template <class H, class... T>
void read(H& h, T&... t) {
  read(h);
  read(t...);
}
template <class A>
void read(A* x, int size) {
  for (int i = (0); (1) > 0 ? i < (size) : i > (size); i += (1)) read(x[i]);
}
template <class A>
void read(vector<A>& x) {
  for (auto& a : x) read(a);
}
template <class T>
void print(T& x) {
  cout << x << ' ';
}
template <class H, class... T>
void print(H h, T... t) {
  print(h);
  print(t...);
}
template <class A>
void print(A* x, int size) {
  for (int i = (0); (1) > 0 ? i < (size) : i > (size); i += (1)) print(x[i]);
  cout << '\n';
}
template <class A>
void print(vector<A>& x) {
  for (auto& a : x) print(a);
}
template <class H, class... T>
void debug(H h, T... t) {
  print(h, t...);
  cout << endl;
}
const int d4i[4] = {-1, 0, 1, 0}, d4j[4] = {0, 1, 0, -1};
const int d8i[8] = {-1, -1, 0, 1, 1, 1, 0, -1},
          d8j[8] = {0, 1, 1, 1, 0, -1, -1, -1};
const int N = 100010, mod = 1e9 + 7;
int n, ans = 1;
long long src[N], tar[N], INF = 2e17;
vector<pair<int, int>> g[N];
bool overflow(long long p, long long q, long long x) {
  if (p > INF / q or q > INF / p) return 1;
  if (p * q - x > INF) return 1;
  return 0;
}
void dfs(int s, int p = 0, int w = 0) {
  for (auto nn : g[s]) dfs(nn.first, s, nn.second);
  if (!ans) return;
  if (p and src[s] != tar[s]) {
    if (src[s] < tar[s]) {
      if (overflow(tar[s] - src[s], 1LL * w, src[p])) {
        ans = 0;
        return;
      }
      src[p] -= (tar[s] - src[s]) * w;
    } else
      src[p] += src[s] - tar[s];
    src[s] = tar[s];
  }
  if (src[s] < tar[s]) ans = 0;
}
void solve() {
  read(n);
  for (int i = (0); (1) > 0 ? i < (n) : i > (n); i += (1)) read(src[i + 1]);
  for (int i = (0); (1) > 0 ? i < (n) : i > (n); i += (1)) read(tar[i + 1]);
  int v, w;
  for (int i = (0); (1) > 0 ? i < (n - 1) : i > (n - 1); i += (1)) {
    read(v, w);
    g[v].push_back({i + 2, w});
  }
  dfs(1);
  cout << (ans ? "YES" : "NO");
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  solve();
}
