#include <bits/stdc++.h>
using namespace std;
struct node {
  int flag, num;
  long long v;
  node() {}
  node(int _flag, int _num, long long _v) {
    flag = _flag;
    num = _num;
    v = _v;
  }
};
const int maxn = 200005;
int ans[maxn], L[maxn], R[maxn], f[maxn], a[maxn];
vector<int> G[maxn], H[maxn];
vector<node> F;
int n;
int cnt;
void ins(int x) {
  while (x <= n) {
    f[x]++;
    x += (x & (-x));
  }
}
int find(int x) {
  int s = 0;
  while (x) {
    s += f[x];
    x -= (x & (-x));
  }
  return s;
}
void dfs(int x, long long h) {
  cnt++;
  L[x] = cnt;
  F.push_back(node(1, x, h - a[x]));
  F.push_back(node(0, x, h));
  for (int i = 0; i < G[x].size(); i++) {
    int y = G[x][i];
    dfs(y, h + H[x][i]);
  }
  R[x] = cnt;
}
bool cmp(const node& a, const node& b) {
  if (a.v != b.v)
    return a.v < b.v;
  else
    return a.flag > b.flag;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 2; i <= n; i++) {
    int p, w;
    scanf("%d%d", &p, &w);
    G[p].push_back(i);
    H[p].push_back(w);
  }
  cnt = 0;
  dfs(1, 0);
  sort(F.begin(), F.end(), cmp);
  for (int i = 0; i < F.size(); i++) {
    node X = F[i];
    if (X.flag) {
      ins(L[X.num]);
    } else {
      ans[X.num] = find(R[X.num]) - find(L[X.num] - 1) - 1;
    }
  }
  for (int i = 1; i <= n; i++) {
    printf("%d", ans[i]);
    if (i == n)
      puts("");
    else
      printf(" ");
  }
  return 0;
}
