1 /*
2 并查集(树实现)
3 路径压缩、按秩合并
4 使用前调用init()
5 find(x) 查找x的根节点(路径压缩)
6 Union(x,y) 启发式合并
7 */
8 #include<bits/stdc++.h>
9 using namespace std;
10 const int size=100005;//集合大小
11 int n,m;//n--元素个数 m--查询次数
12 struct node{
13 int fa,cnt,val;//父节点、自己及子树元素个数(仅当其为根节点始有意义)、元素的值
14 }Set[size];
15 inline int find(int x) {return Set[x].fa==x?x:(Set[x].fa=find(Set[x].fa));}//路径压缩
16 inline void Union(int x,int y)
17 {
18 x=find(x),y=find(y);if(x==y) return;
19 if(Set[x].cnt>Set[y].cnt) {Set[y].fa=x;Set[x].cnt+=Set[y].cnt;}//按秩合并
20 else {Set[x].fa=y;Set[y].cnt+=Set[x].cnt;}
21 }
22 inline void init() {for(int i=1;i<=n;i++) Set[i].fa=Set[i].val=i,Set[i].cnt=1;}//初始化
23 int main()
24 {
25 scanf("%d%d",&n,&m);
26 init();
27 for(int i=1,x,y,z;i<=m;i++)
28 {
29 scanf("%d%d%d",&x,&y,&z);
30 if(x==1) Union(y,z);
31 if(x==2)
32 {
33 if(find(y)==find(z)) printf("Y\n");
34 else printf("N\n");
35 }
36 }
37 return 0;
38 }