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.
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; }