题意:有n个结点,初始时每个结点的父节点都不存在。你的任务是执行如下操作:
I u v:把结点u的父节点设为v,距离为|u -v|除以1000的余数。输入保证执行指令前u没有父节点。
E u :询问u到根节点的距离。
#include<cstdio>
#include<algorithm>
#define mx 20010
using namespace std;
int fa[mx],dis[mx];
int find(int x)
{
if(fa[x]!=x)
{
int r=find(fa[x]);
dis[x]+=dis[fa[x]];
return fa[x]=r;
}
return x;
}
int main()
{
int i,n,u,v,t;
char s;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
fa[i]=i,dis[i]=0;
}
while(scanf(" %c",&s)!=EOF && s!='O')
{
if(s=='E')
{
scanf("%d",&u);
find(u);
printf("%d\n",dis[u]);
}
else
{
scanf("%d%d",&u,&v);
fa[u]=v;
dis[u]=abs(u-v)%1000;
}
}
}
return 0;
}