并查集的应用。
在压缩路径的时候维护一个dist数组,保存其到祖先的长度。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int uset[21000],dist[21000];
int abs(int a)
{
return a>0?a:-a;
}
bool init()
{
int i;
for (i=0; i<21000; i++)
uset[i]=i;
memset(dist,0,sizeof(dist));
return true;
}
int root(int x)
{
int t;
if (uset[x] == x)
return x;
t=root(uset[x]);
dist[x]+=dist[uset[x]];
return uset[x]=t;
}
int main()
{
int prob,n,t1,t2,op;
char tc;
scanf("%d",&prob);
while (prob--)
{
init();
scanf("%d",&op);
while (true)
{
scanf("%*c%c",&tc);
if (tc == 'E')
{
scanf("%d",&t1);
root(t1);
printf("%d\n",dist[t1]);
}
else if (tc == 'I')
{
scanf("%d%d",&t1,&t2);
uset[t1]=t2;
dist[t1]=abs(t2-t1)%1000;
}
else
break;
}
}
}