#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
int ls,rs,siz;
}t[N];
int n,x,root[N],a[N],b[N],tot;
vector<int>emp[N];
int dfn[N],_end[N],dfnr[N],dfnt;
void dfs(int cur)
{
dfn[cur]=++dfnt;dfnr[dfnt]=cur;
for(int i=0;i<emp[cur].size();i++)
{
int to=emp[cur][i];
dfs(to);
}
_end[cur]=dfnt;
}
void push_up(int cur)
{
t[cur].siz=t[t[cur].ls].siz+t[t[cur].rs].siz;
}
int build(int lt,int rt)
{
int cur=++tot;
t[cur].siz=0;
if(lt==rt)
{
return cur;
}
int mid=(lt+rt)>>1;
t[cur].ls=build(lt,mid);
t[cur].rs=build(mid+1,rt);
return cur;
}
int query(int curl,int curr,int lt,int rt,int val)
{
if(val<lt)
return 0;
if(rt<=val)
return t[curr].siz-t[curl].siz;
int mid=(lt+rt)>>1;
return query(t[curl].ls,t[curr].ls,lt,mid,val)+query(t[curl].rs,t[curr].rs,mid+1,rt,val);
}
int upd(int cur,int lt,int rt,int loc)
{
int np=++tot;t[np]=t[cur];
if(lt==rt)
{
t[np].siz++;
return np;
}
int mid=(lt+rt)>>1;
if(loc<=mid)t[np].ls=upd(t[np].ls,lt,mid,loc);
else t[np].rs=upd(t[np].rs,mid+1,rt,loc);
push_up(np);
return np;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i],b[i]=a[i];
sort(b+1,b+n+1);
int len=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+len+1,a[i])-b;
for(int i=2;i<=n;i++)
cin>>x,emp[x].push_back(i);
dfs(1);root[0]=build(1,len);
for(int i=1;i<=n;i++)
root[i]=upd(root[i-1],1,len,a[dfnr[i]]);
for(int i=1;i<=n;i++)
cout<<_end[i]-dfn[i]+1-query(root[dfn[i]-1],root[_end[i]],1,len,a[i])<<"\n";
return 0;
}