Problem Description
John are playing with blocks. There are N blocks (1 <= N <= 30000) numbered 1…N。Initially, there are N piles, and each pile contains one block. Then John do some operations P times (1 <= P <= 1000000). There are two kinds of operation:
M X Y : Put the whole pile containing block X up to the pile containing Y. If X and Y are in the same pile, just ignore this command.
C X : Count the number of blocks under block X
You are request to find out the output for each C operation.
Input
The first line contains integer P. Then P lines follow, each of which contain an operation describe above.
Output
Output the count for each C operations in one line.
Sample Input
6
M 1 6
C 1
M 2 4
M 2 6
C 3
C 4
Sample Output
1
0
2
下面的都是爸爸
下面有几个,把原来的爹算好权值
然后原来的爹的爹更新成新的爹
更新的时候上面的集合要加好原来的爹的值
合并函数在合并的时候要算出爹上面压着几个儿子
#include<iostream>
#include<cstdlib>
#include<memory.h>
#include<cstdio>
#include<map>
#include<cmath>
using namespace std;
int shangbian[30002];
int zhi[30002];
int die[30002];
//int di[30002];
/*int dia(int x)
{
int t1,t2=x;
while(x!=di[x])
{
x=di[x];
}
while(t2!=di[t2])
{
t1=di[t2];
di[t2]=x;
t2=t1;
}
return x;
}*/
int dinga(int x)
{
if(x!=die[x])
{
int fa=die[x];
die[x]=dinga(fa);
zhi[x]+=zhi[fa];
}
return die[x];
}
void tiaozheng(int shang,int xia)
{
int a1=dinga(shang);
int b1=dinga(xia);
if(a1!=b1)
{
die[a1]=b1;
zhi[a1]=shangbian[b1]+1+zhi[a1];
shangbian[b1]+=shangbian[a1]+1;
}
//int shangdi=dia(shang);
//int xiading=dinga(xia);
//dian[shangdi][1]=xiading;
//dian[xiading][0]=shangdi;
//di[shangdi]=di[xiading];
//ding[xiading]=ding[shangdi];
/*int t1=shangdi;
while(t1!=dian[t1][0])
{
zhi[t1]=zhi[t1]+zhi[xiading];
t1=dian[t1][0];
}
zhi[t1]=zhi[t1]+zhi[xiading];*/
}
/*int qiuzhi(int x)
{
int sdsd=dia(x);
int s=0;
while(sdsd!=x)
{
sdsd=dian[sdsd][0];
s++;
}
return s;
}*/
int main()
{
int n;
char a[5];
while(cin>>n)
{
for(int a=0;a<30001;a++)
{
die[a]=a;
zhi[a]=0;
shangbian[a]=0;
}
int shang,xia,xiaa;
while(n--)
{
scanf("%s",a);
if(a[0]=='M')
{
int s,d;
scanf("%d%d",&s,&d);
tiaozheng(s,d);
}
else
{
int s;
scanf("%d",&s);
dinga(s);
cout<<zhi[s]<<endl;
}
}
}
return 0;
}