思路:并查集。
注意:只能将i挂在j上,不能写成了把i挂在j的根节点上。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <cstring>
#include <map>
using namespace std;
int n;
int fa[20005];
int d[20005];
int find(int x) {
if(fa[x]==-1) return x;
int y=fa[x];
fa[x]=find(fa[x]);
d[x]+=d[y];
return fa[x];
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
memset(fa,-1,sizeof(fa));
memset(d,0,sizeof(d));
scanf("%d",&n);
char opr;
while(true) {
while(~scanf("%c",&opr)&&!isalpha(opr));
if(opr=='O') break;
else if(opr=='I') {
int x,y,z;
scanf("%d%d",&x,&y);
z=abs(x-y)%1000;
fa[x]=y;
d[x]=z;
} else {
int x;
scanf("%d",&x);
find(x);
printf("%d\n",d[x]);
}
}
}
return 0;
}