为什么query函数中加上Pushup会得到错误答案
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,p[maxn],ans[maxn],lc[maxn*18],rc[maxn*18],d[maxn*18],b[maxn],rt[maxn],num;
struct node{
int next,to;
}edge[maxn<<1];
int head[maxn<<1],len;
void Insert(int from,int to){
edge[++len].next=head[from];
edge[len].to=to;
head[from]=len;
}
void Pushup(int p){
d[p]=d[lc[p]]+d[rc[p]];
}
void Modify(int s,int t,int &p,int pos){
if(!p) p=++num;
if(s==t){
d[p]++;
return;
}
int mid=s+t>>1;
if(pos<=mid) Modify(s,mid,lc[p],pos);
else Modify(mid+1,t,rc[p],pos);
Pushup(p);
}
int query(int s,int t,int p,int l,int r){
if(!p) return 0;
if(l<=s && r>=t) return d[p];
int mid=s+t>>1,tot=0;
Pushup(p);
if(l<=mid) tot+=query(s,mid,lc[p],l,r);
if(r>mid) tot+=query(mid+1,t,rc[p],l,r);
return tot;
}
int Merge(int s,int t,int l,int r){
if(!l || !r) return l+r;
if(s==t){
d[l]+=d[r];
return l;
}
int mid=s+t>>1;
lc[l]=Merge(s,mid,lc[l],lc[r]);
rc[l]=Merge(mid+1,t,rc[l],rc[r]);
Pushup(l);
return l;
}
void dfs(int u,int fa){
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(v==fa) continue;
dfs(v,u);
rt[u]=Merge(1,n,rt[u],rt[v]);
}
ans[u]+=query(1,n,rt[u],p[u]+1,n);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&p[i]),b[i]=p[i];
sort(b+1,b+1+n);
for(int i=1;i<=n;i++) p[i]=lower_bound(b+1,b+1+n,p[i])-b;
for(int i=2;i<=n;i++){
int v;
scanf("%d",&v);
Insert(v,i),Insert(i,v);
}
for(int i=1;i<=n;i++){
rt[i]=++num;
Modify(1,n,rt[i],p[i]);
}
dfs(1,0);
//for(int i=1;i<=num;i++) cout <<d[i]<<' ';
//cout <<endl;
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}