树状数组
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std; const int maxn = + ;
vector<int>Tree[ + ];
int n;
int val[ + ];
int c[maxn];
int ans[ + ]; int lowbit(int x)
{
return x & (-x);
} void Update(int x, int add)
{
while (x < maxn)
{
c[x] += add;
x += lowbit(x);
}
} int Get(int x)
{
int ret = ;
while (x != )
{
ret += c[x];
x -= lowbit(x);
}
return ret;
} void init()
{
for (int i = ; i <= n; i++) Tree[i].clear();
memset(c, , sizeof c);
} void DFS(int now)
{
int A, B;
A = Get( + ) - Get(val[now]);
for (int i = ; i < Tree[now].size(); i++)
DFS(Tree[now][i]);
B = Get( + ) - Get(val[now]);
ans[now] = B - A;
Update(val[now], );
} int main()
{
while (~scanf("%d", &n))
{
init();
for (int i = ; i < n; i++)
{
int k;
scanf("%d", &k);
Tree[k].push_back(i);
}
for (int i = ; i < n; i++)
{
scanf("%d", &val[i]);
val[i]++;
}
DFS();
for (int i = ; i < n; i++)
{
if (i < n - ) printf("%d ", ans[i]);
else printf("%d\n", ans[i]);
}
}
return ;
}