1 #include "bits/stdc++.h"
2 using namespace std;
3 const int MAX=2e5+5;
4 typedef long long LL;
5 LL n;
6 LL tot,head[MAX],adj[MAX<<1],nxt[MAX<<1];
7 LL ans[MAX],val[MAX],son[MAX],in[MAX];
8 void addedge(int u,int v){
9 tot++;
10 adj[tot]=v;
11 nxt[tot]=head[u];
12 head[u]=tot;
13 }
14 void dfs1(LL x,LL fa){
15 //if (in[x]==0) son[x]=1;
16 LL i,j;bool flag=true;
17 for (i=head[x];i;i=nxt[i]){
18 if (adj[i]==fa) continue;
19 dfs1(adj[i],x);
20 flag=false;
21 son[x]+=son[adj[i]];
22 val[x]+=val[adj[i]];
23 ans[x]=max(ans[x],ans[adj[i]]);
24 }
25 if (flag) son[x]=1;
26 ans[x]=max(ans[x],(val[x]-1)/son[x]+1);
27 }
28
29 int main(){
30 freopen ("c.in","r",stdin);
31 freopen ("c.out","w",stdout);
32 LL i,j,x;
33 scanf("%lld",&n);
34 memset(head,0,sizeof(head));
35 memset(in,0,sizeof(in));
36 memset(ans,0,sizeof(ans));
37 for (i=2;i<=n;i++){
38 scanf("%lld",&x);
39 addedge(i,x);
40 addedge(x,i);
41 in[x]++;
42 }
43 for (i=1;i<=n;i++) scanf("%lld",val+i);
44 bool flag=true;
45 for (i=1;i<=n;i++) if (val[i]!=0) {flag=false;break;}
46 if (flag) {printf("0");return 0;}
47 dfs1(1,0);
48 printf("%lld",ans[1]);
49 return 0;
50