#include <bits/stdc++.h>
using namespace std;
long long int n, a[200005], dpth[200005], dpthmia[200005], vis[200005];
vector<pair<long long int, long long int> > v[400005];
long long int intim[400005], outim[400005], tim;
vector<long long int> lin, seg, mst[2000000];
void dfs(long long int node) {
  vis[node] = 1;
  intim[node] = tim++;
  lin.push_back(node);
  for (auto it : v[node]) {
    if (!vis[it.first]) {
      dpth[it.first] = it.second + dpth[node];
      dfs(it.first);
    }
  }
  outim[node] = tim++;
  lin.push_back(node);
  dpthmia[node] = dpth[node] - a[node];
}
void build(long long int node, long long int st, long long int en) {
  if (st == en) {
    mst[node].push_back(seg[st]);
    return;
  } else {
    long long int mid = (st + en) / 2;
    build(2 * node, st, mid);
    build(2 * node + 1, mid + 1, en);
    mst[node].resize(mst[2 * node].size() + mst[2 * node + 1].size());
    merge(mst[2 * node].begin(), mst[2 * node].end(), mst[2 * node + 1].begin(),
          mst[2 * node + 1].end(), mst[node].begin());
  }
}
long long int qry(long long int node, long long int st, long long int en,
                  long long int l, long long int r, long long int val) {
  if (st > en || l > r || st > r || en < l)
    return 0;
  else if (st >= l && en <= r) {
    return upper_bound(mst[node].begin(), mst[node].end(), val) -
           mst[node].begin();
  } else {
    long long int mid = (st + en) / 2;
    return qry(2 * node, st, mid, l, r, val) +
           qry(2 * node + 1, mid + 1, en, l, r, val);
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  long long int i, j, k, x, y;
  cin >> n;
  lin.push_back(0);
  seg.push_back(0);
  tim = 1;
  for (i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (i = 1; i < n; i++) {
    cin >> x >> y;
    v[x].push_back({i + 1, y});
    v[i + 1].push_back({x, y});
  }
  dfs(1);
  for (i = 1; i < lin.size(); i++) {
    seg.push_back(dpthmia[lin[i]]);
  }
  build(1, 1, seg.size());
  for (i = 1; i <= n; i++) {
    long long int x, y;
    x = intim[i] + 1;
    y = outim[i] - 1;
    cout << qry(1, 1, seg.size(), x, y, dpth[i]) / 2 << " ";
  }
  return 0;
}
