#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const int MAXN = 1e5 + 10;
int n;
int p[MAXN],b[MAXN],ans[MAXN],v[MAXN],head[MAXN],cnt=0;
struct node{
int v,nxt;
}e[MAXN];
void add(int u,int v){
e[++cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int lowbit(int x){
return x&(-x);
}
void update(int x,int y){
while(x<=n){
v[x]+=y;
x+=lowbit(x);
}
}
int query(int x){
int ret=0;
while(x>0){
ret+=v[x];
x-=lowbit(x);
}
return ret;
}
void dfs(int x){
ans[x]=-(query(n)-query(p[x]));
for(int i=head[x];i;i=e[i].nxt) dfs(e[i].v);
ans[x]+=(query(n)-query(p[x]));
update(p[x],1);
}
int main(){
scanf("%d",&n);
FL(i,1,n) scanf("%d",&p[i]),b[i]=p[i];
sort(b+1,b+n+1);
FL(i,1,n) p[i]=lower_bound(b+1,b+n+1,p[i])-b;
FL(i,2,n){
int fa;
scanf("%d",&fa);
add(fa,i);
}
dfs(1);
FL(i,1,n) printf("%d\n",ans[i]);
return 0;
}