您的位置:首页 > 产品设计 > UI/UE

HDU 2818 Building Block

2016-07-26 23:15 375 查看

Building Block

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 105   Accepted Submission(s) : 43

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

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<cmath>
#include<cstring>
#include<climits>
#include<string>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;

const int M=30005;
int pre[M];
int num[M];
int under[M];
int i,j,n,m,k;

void init()
{
for(i=0;i<M;i++)
{
pre[i]=i;
num[i]=1;
under[i]=0;
}
}

int f(int x)
{
int t;
if(x!=pre[x])
{
t=f(pre[x]);
under[x]+=under[pre[x]];
pre[x]=t;
}
return pre[x];
}

void merge_(int x,int y)
{
int fx=f(x),fy=f(y);
if(fx!=fy)
{
under[fx]=num[fy];
num[fy]+=num[fx];
pre[fx]=fy;
}
}

int main()
{
int t;char str;
cin>>t;
init();
while(t--)
{
cin>>str;
if(str=='M')
{
int a,b;
cin>>a>>b;
merge_(a,b);
}
else
{
int c;
cin>>c;
f(c);
cout<<under[c]<<endl;
}
}
return 0;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: