#include<iostream>
#include<vector>
#define M 10005
using namespace std;
vector<int> edge[M];
int fa[M],w[M],v[M],depth[M],dis[M];
//depth深度 dis离根的距离
int n,u;
void dfs(int u,int fa){
depth[u]=depth[fa]+1;
dis[u]=dis[fa]+v[u];
for(int i=0;i<edge[u].size();i++){
dfs(edge[u][i],u);
}
}
int main(){
cin>>n;
edge[0].push_back(1);
for(int i=2;i<=n;i++){
cin>>u;
edge[u].push_back(i);
fa[i]=u;
}
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<=n;i++) cin>>w[i];
dfs(1,0);
// for(int i=1;i<=n;i++){
// cout<<depth[i]<<' '<<dis[i]<<endl;
// }
int l,r,ans,mid;
for(int i=1;i<=n;i++){
l=0,r=depth[i];
while(l<r){
mid=(l+r)>>1;
if(dis[mid]>w[i]){
r=mid;
}
if(dis[mid]<=w[i]){
l=mid+1;
ans=max(ans,dis[mid]);
}
}
cout<<ans<<' ';
}
return 0;
}