#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;
}