对于3个传递情报任务,都是经过5名情报员,分别是4号、2号、1号、3号和7号。其中,对于第1个任务,所有情报员(危险值为0)都不对情报构成威胁;对于第2个任务,有2名情报员对情报构成威胁,分别是1号情报员(危险值为3)和4号情报员(危险值为2),7号情报员(危险值为1)并不构成威胁;对于第3个任务,只有1名情报员对情报构成威胁。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=200010;
struct sag
{
int ls,rs,siz;
}s[maxn*30];
int n,m,cnt,root,tot;
int rt[maxn],fa[maxn][20],to[maxn],next[maxn],head[maxn],dep[maxn];
int v[maxn],qa[maxn],qb[maxn],qc[maxn];
int rd()
{
int ret=0; char gc=getchar();
while(gc<‘0‘||gc>‘9‘) gc=getchar();
while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+gc-‘0‘,gc=getchar();
return ret;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void insert(int x,int &y,int l,int r,int pos)
{
if(!pos)
{
y=x;
return ;
}
y=++tot;
if(l==r)
{
s[y].siz++;
return;
}
int mid=l+r>>1;
if(pos<=mid) s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,pos);
else s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+1,r,pos);
s[y].siz=s[x].siz+1;
}
void dfs(int x)
{
insert(rt[fa[x][0]],rt[x],1,m,v[x]);
for(int i=head[x];i!=-1;i=next[i]) dep[to[i]]=dep[x]+1,dfs(to[i]);
}
int query(int a,int b,int c,int d,int l,int r,int pos)
{
if(pos<=0) return 0;
if(r<=pos) return s[a].siz+s[b].siz-s[c].siz-s[d].siz;
int mid=l+r>>1;
if(pos<=mid) return query(s[a].ls,s[b].ls,s[c].ls,s[d].ls,l,mid,pos);
return s[s[a].ls].siz+s[s[b].ls].siz-s[s[c].ls].siz-s[s[d].ls].siz+query(s[a].rs,s[b].rs,s[c].rs,s[d].rs,mid+1,r,pos);
}
int main()
{
n=rd();
int i,j,a,b,c;
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++)
{
fa[i][0]=rd();
if(!fa[i][0]) root=i;
else add(fa[i][0],i);
}
m=rd();
for(i=1;i<=m;i++)
{
b=rd();
if(b==1) qa[i]=rd(),qb[i]=rd(),qc[i]=i-rd()-1;
else a=rd(),v[a]=i;
}
for(j=1;(1<<j)<n;j++)
for(i=1;i<=n;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
dep[1]=1,dfs(1);
for(i=1;i<=m;i++)
{
if(qa[i])
{
a=qa[i],b=qb[i];
if(dep[a]<dep[b]) swap(a,b);
for(j=19;j>=0;j--) if(dep[fa[a][j]]>=dep[b]) a=fa[a][j];
if(a!=b)
{
for(j=19;j>=0;j--) if(fa[a][j]!=fa[b][j]) a=fa[a][j],b=fa[b][j];
a=fa[a][0];
}
c=dep[qa[i]]+dep[qb[i]]-2*dep[a]+1;
printf("%d %d\n",c,query(rt[qa[i]],rt[qb[i]],rt[a],rt[fa[a][0]],1,m,qc[i]));
}
}
return 0;
}