报错信息:Runtime Error. Received signal 11: Segmentation fault with invalid memory reference. 本地无视发生。为什么? P4216```cpp #include #include #include #include <memory.h> #include using namespace std; long long tot=1,n,q; long long rot; long long ver[200005],hed[200005],nxt[200005]; long long dfn[200005],node_top[200005],rnk[200005],fa[200005]; long long hson[200005],siz[200005],dep[200005]; bool visited[200005];long long tott=0; struct node{ long long l,r,v; }; node tree[800020]; long long ans[200005]; struct fuck{ long long x,y,op,t,ini; }; fuck que[200005];fuck eu[200005]; bool cmp1(fuck a,fuck b){ return a.t==b.t?a.op>b.op:a.t<b.t; } void add_edge(long long x,long long y){ ++tot;ver[tot]=y;nxt[tot]=hed[x];hed[x]=tot;return ; } void dfs1(long long now,long long depth){ dep[now]=depth; visited[now]=true; siz[now]++; long long maxx=0; for(long long i=hed[now];i;i=nxt[i]){ if(visited[ver[i]]) continue; fa[ver[i]]=now; dfs1(ver[i],depth+1); if(siz[ver[i]]>maxx){ maxx=siz[ver[i]]; hson[now]=i; } siz[now]+=siz[ver[i]]; } return ; } void dfs2(long long now,long long now_top){ visited[now]=true; node_top[now]=now_top; if(hson[now]) dfs2(ver[hson[now]],now_top); ++tott; dfn[now]=tott;rnk[tott]=now; for(long long i=hed[now];i;i=nxt[i]){ if(visited[ver[i]] || hson[now]==i) continue; dfs2(ver[i],ver[i]); } return ; } void build(long long now,long long l,long long r){ tree[now].l=l;tree[now].r=r;tree[now].v=0; if(l==r) return ; long long mid=(l+r)>>1; build(now2,l,mid);build(now2+1,mid+1,r); return ; } void upd(long long now,long long tar){ tree[now].v++; if(tree[now].l==tree[now].r) return ; long long mid=(tree[now].l+tree[now].r)>>1; if(tar<=mid) upd(now2,tar); else upd(now2+1,tar); return ; } long long ask(long long now,long long l,long long r){ if(tree[now].l==l && tree[now].r==r){ return tree[now].v; } long long mid=(tree[now].l+tree[now].r)>>1; if(r<=mid) return ask(now2,l,r); else if(l>=mid+1) return ask(now2+1,l,r); else return ask(now2,l,mid)+ask(now2+1,mid+1,r); } long long lca(long long x,long long y){ while(node_top[x]!=node_top[y]){ if(dep[node_top[x]]<dep[node_top[y]]) swap(x,y); x=fa[node_top[x]]; } if(dep[x]<dep[y]) return x; return y; } int main(){ scanf("%lld",&n); long long x,y,z,c,op; for(long long i=1;i<=n;i++){ scanf("%lld",&x); if(x==0){ rot=i; continue; } add_edge(x,i); } memset(visited,false,sizeof(visited)); dfs1(rot,1); memset(visited,false,sizeof(visited)); dfs2(rot,rot); scanf("%lld",&q); for(long long i=1;i<=q;i++){ scanf("%lld",&op); if(op==1){ scanf("%lld%lld%lld",&x,&y,&c); c=i-c-1;c=max((long long)0,c); que[i].x=x;eu[i].x=que[i].x; que[i].y=y;eu[i].y=que[i].y; que[i].t=c;eu[i].t=que[i].t; que[i].op=1;eu[i].op=que[i].op; que[i].ini=i;eu[i].op=que[i].op; } else { scanf("%lld",&x); que[i].op=2;eu[i].op=que[i].op; que[i].t=i;eu[i].t=que[i].t; que[i].x=x;eu[i].x=que[i].x; }
}
sort(que+1,que+q+1,cmp1);
memset(ans,-1,sizeof(ans));
build(1,1,n);
memset(visited,false,sizeof(visited));
for(long long i=1;i<=q;i++){
if(que[i].op==1 && que[i].t!=0){
x=que[i].x;y=que[i].y;
ans[que[i].ini]=0;
while(node_top[x]!=node_top[y]){
if(dep[node_top[x]]<dep[node_top[y]])
swap(x,y);
ans[que[i].ini]+=ask(1,dfn[node_top[x]],dfn[x]);
x=fa[node_top[x]];
}
if(dep[node_top[x]]<dep[node_top[y]])
swap(x,y);
ans[que[i].ini]+=ask(1,dfn[y],dfn[x]);
}
else if(que[i].op==1 && que[i].t==0){
ans[que[i].ini]=0;
}
else if(que[i].op==2 && !visited[que[i].x]){
upd(1,dfn[que[i].x]);visited[que[i].x]=true;
}
else ;
}
for(long long i=1;i<=q;i++){
if(ans[i]==-1)
continue;
long long lcb;
lcb=lca(eu[i].x,eu[i].y);
printf("%lld %lld\n",-dep[lcb]+dep[eu[i].x]-dep[lcb]+dep[eu[i].y]+1,ans[i]);
}
return 0;
}