玄关
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
#define int long long
using ll = long long;
#define fc freopen("in.in","r",stdin),freopen("out.out","w",stdout)
const int N=1e6+10;
struct SGT{
int ls,rs,val;
}tr[N*50];
int ans[N],rt[N],tot;
void pushup(int u)
{
tr[u].val=tr[tr[u].ls].val+tr[tr[u].rs].val;
}
void insert(int &u,int l,int r,int v,int p,int mid=0)
{
if(!u) u=++tot;
if(l==r) return tr[u].val+=p,void();
v<=(mid=(l+r>>1))?insert(tr[u].ls,l,mid,v,p):insert(tr[u].rs,mid+1,r,v,p);
pushup(u);
}
int query(int u,int l,int r,int L,int R,int mid=0,int res=0)
{
if(l>R||r<L) return 0;
if(!u) return 0;
if(L<=l&&r<=R) return tr[u].val;
if(L<(mid=l+r>>1)) res+=query(tr[u].ls,l,mid,L,R);
if(R>mid) res+=query(tr[u].rs,mid+1,r,L,R);
return res;
}
int merge(int u,int v,int l,int r,int mid=0)
{
if(!u||!v) return u+v;
if(l==r)
{
tr[u].val+=tr[v].val;
return u;
}
tr[u].ls=merge(tr[u].ls,tr[v].ls,l,(mid=l+r>>1));
tr[u].rs=merge(tr[u].rs,tr[v].rs,mid+1,r);
pushup(u);
return u;
}
int n;
vector<int> E[N];
int val[N],p[N];
void dfs(int u)
{
for(auto to:E[u])
{
dfs(to);
rt[u]=merge(rt[u],rt[to],1,n);
}
ans[u]=query(rt[u],1,n,val[u]+1,n);
}
signed main() {
fc;
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>val[i],p[i]=val[i];
sort(p+1,p+n+1);
p[0]=unique(p+1,p+n+1)-(p+1);
for(int i=1;i<=n;i++){
val[i]=lower_bound(p+1,p+p[0]+1,val[i])-p;
assert(val[i]!=0);
insert(rt[i],1,n,val[i],1);
}
for(int i=2,x;i<=n;i++) cin>>x,E[x].push_back(i);
dfs(1);
for(int i=1;i<=n;i++) cout<<ans[i]<<'\n';
return 0;
}