5 #include<iostream>
6 #include<stdio.h>
7 #include<string.h>
8 #include<algorithm>
9 #include<stdlib.h>
10 #include<math.h>
11 #include<queue>
12 #include<vector>
13 #include<map>
14 #define MAXN 20000+10
15 //#define MAXM 20000+5
16 #define oo 9556531
17 #define eps 0.000001
18 #define PI acos(-1.0)
19 #define REP1(i,n) for(int i=0;i<(n);i++)
20 #define REP2(i,n) for(int i=1;i<=(n);i++)
21 using namespace std;
22
23 int p[MAXN];
24 int d[MAXN];
25 int n,t;
26
27 void init()
28 {
29 REP2(i,n)
30 {
31 p[i]=i;
32 d[i]=0;
33 }
34 }
35
36 int findx(int x)
37 {
38 // return p[x]==x?0:d[x]+getans(p[x]);
39 if (p[x]!=x) //d[x]任然为0,不需要更新
40 {
41 int px=findx(p[x]);//压缩栈,保证前面的根节点已经更新过
42 d[x]=d[x]+d[p[x]];//保证d[p[x]]已经是p[x]到根节点的距离
43 // cout<<"px="<<px<<","<<"d[x]="<<d[x]<<endl;
44 return p[x]=px;//在所有的d更新完毕后,把x连接到根节点px上
45 }else return x;
46 }
47
48 int main()
49 {
50 cin>>t;
51 for(;t;t--)
52 {
53 scanf("%d\n",&n);
54 init();
55 char Q[20];
56 while(cin>>Q)
57 {
58 // cout<<"Q="<<Q<<endl;
59 if (Q[0]=='O') break;
60 if (Q[0]=='E')//多次询问E,动态更新
61 {
62 int x;cin>>x;
63 int px=findx(x);
64 cout<<d[x]<<endl;
65 }
66 if (Q[0]=='I')
67 {
68 int i,j;
69 cin>>i>>j;
70 d[i]=abs(i-j)%1000;//d[i]:i到父节点的距离,注意取模
71 p[i]=j;//i的父节点是j
72 }
73 }
74 }
75 return 0;
76 }