#include<stdio.h>
int n,q;
//edge part
int head[200086],to[200086],nxt[200086],edge_tot;
void add_edge(int a,int b)
{
to[++edge_tot]=b;
nxt[edge_tot]=head[a];
head[a]=edge_tot;
}
//TCP part
int tree_root;
int hson[200086],dep[200086],siz[200086],fa[200086];
void dfs1(int now,int f)
{
siz[now]=1;
dep[now]=dep[f]+1;
for(int i=head[now];i;i=nxt[i])
if(to[i]!=f)
{
dfs1(to[i],now);
siz[now]+=siz[to[i]];
if(siz[hson[now]]<siz[to[i]])
hson[now]=to[i];
}
}
int dfn[200086],rfn[200086],top[200086],tree_tot;
void dfs2(int now,int f)
{
if(hson[now])
{
dfn[hson[now]]=++tree_tot;
rfn[tree_tot]=hson[now];
top[hson[now]]=top[now];
dfs2(hson[now],now);
}
for(int i=head[now];i;i=nxt[i])
if(!top[to[i]])
{
dfn[to[i]]=++tree_tot;
rfn[tree_tot]=to[i];
top[to[i]]=to[i];
dfs2(to[i],now);
}
}
inline void tcp_init()
{
dfs1(tree_root,0);
dfn[tree_root]=tree_tot=1;
rfn[tree_tot]=tree_root;
top[tree_root]=tree_root;
dfs2(tree_root,0);
}
inline int lca(int a,int b)
{
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])
a^=b,b^=a,a^=b;
a=fa[top[a]];
}
return dep[a]<dep[b]?a:b;
}
//prizident-tree part
struct node{
int l,r,val;
}tr[27000086];
int root[200086],pt_tot;
void build(int &now,int l,int r)
{
if(!now)
now=++pt_tot;
if(l!=r)
{
int mid=l+r>>1;
build(tr[now].l,l,mid);
build(tr[now].r,mid+1,r);
}
}
void insert(int &now,int pnow,int l,int r,int pos)
{
if(!now)
now=++pt_tot;
tr[now].val=tr[pnow].val+1;
if(l>=r)
return;
int mid=l+r>>1;
if(pos<=mid)
{
tr[now].r=tr[pnow].r;
insert(tr[now].l,tr[pnow].l,l,mid,pos);
}
else
{
tr[now].l=tr[pnow].l;
insert(tr[now].r,tr[pnow].r,mid+1,r,pos);
}
}
int getsum(int pnow,int now,int l,int r,int pos)
{
if(l==r)
return tr[now].val-tr[pnow].val;
int mid=l+r>>1;
if(pos<=mid)
return getsum(tr[pnow].l,tr[now].l,l,mid,pos);
else return tr[tr[now].l].val-tr[tr[pnow].l].val+getsum(tr[pnow].r,tr[now].r,mid+1,r,pos);
}
int task_tot,tim[200086];
struct tsk{
int bt,et,c,tim;
}tasks[200086];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",fa+i);
if(!fa[i])
tree_root=i;
tim[i]=200086;
}
tcp_init();
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int op;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&tasks[task_tot].bt,&tasks[task_tot].et,&tasks[task_tot].c);
tasks[task_tot].tim=i;
task_tot++;
}
else
{
int that;
scanf("%d",&that);
if(tim[that]==200086)
tim[that]=i;
}
}
build(root[0],1,200086);
for(int i=1;i<=n;i++)
insert(root[i],root[i-1],1,200086,tim[rfn[i]]);
for(int i=0;i<task_tot;i++)
{
printf("%d ",dep[tasks[i].bt]+dep[tasks[i].et]+1-2*dep[lca(tasks[i].bt,tasks[i].et)]);
int ans=0,a=tasks[i].bt,b=tasks[i].et;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])
a^=b,b^=a,a^=b;
ans+=getsum(root[dfn[top[a]]],root[dfn[a]],1,200086,tasks[i].tim-tasks[i].c-1);
a=fa[top[a]];
}
if(dep[a]>dep[b])
a^=b,b^=a,a^=b;
ans+=getsum(root[dfn[a]],root[dfn[b]],1,200086,tasks[i].tim-tasks[i].c-1);
printf("%d\n",ans);
}
return 0;
}
孩子对着这么长的代码已经疯掉了,帮帮忙吧