#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long n, a[N];
vector<long long> f[N];
struct P {
  long long son, cnt, mx;
} t[N];
void dfs(long long pos) {
  if (!f[pos].size()) {
    t[pos] = {1, a[pos], a[pos]};
    return;
  }
  t[pos] = {0, a[pos], 0};
  for (int j = 0; j < f[pos].size(); j++) {
    long long u = f[pos][j];
    dfs(u);
    t[pos].son += t[u].son;
    t[pos].cnt += t[u].cnt;
    t[pos].mx = max(t[pos].mx, t[u].mx);
  }
  long long q = ceil(1.0 * t[pos].cnt / t[pos].son);
  t[pos].mx = max(t[pos].mx, q);
}
int main() {
  scanf("%lld", &n);
  for (int i = 2; i <= n; i++) {
    long long p;
    scanf("%lld", &p);
    f[p].push_back(i);
  }
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
  dfs(1);
  cout << t[1].mx;
  return 0;
}
