裸的带权并查集,路径压缩地同时顺便把到根的dis也压缩一下。
const
MAXN=30050;
var
f,dis,size:array[0..MAXN] of longint;
n,i,f1,f2,x,y:longint;
opt:char;
function find(x:longint):longint;
var
k:longint;
begin
if (f[x]=x) then exit(x);
k:=find(f[x]);
dis[x]:=dis[f[x]]+dis[x];
f[x]:=k;
exit(k);
end;
begin
assign(input,'cubes.in');reset(input);
assign(output,'cubes.out');rewrite(output);
readln(n);
for i:=1 to MAXN do f[i]:=i;
for i:=1 to MAXN do dis[i]:=0;
for i:=1 to MAXN do size[i]:=1;
for i:=1 to n do
begin
read(opt);
if opt='M'
then
begin
readln(x,y);
f1:=find(x);
f2:=find(y);
f[f1]:=f2;
dis[f1]:=size[f2];
size[f2]:=size[f2]+size[f1];
end
else
begin
readln(x);
find(x);
writeln(dis[x]);
end;
end;
close(input);close(output);
end.