#include <bits/stdc++.h>
using namespace std;
int n, q;
const int N = 1e5 + 5;
int parent[N], sz[N];
void make_set(){
// Đặt nút "cha" của mỗi tập hợp là chính nó
// Tuy nhiên, ở đây ta đặt kích cỡ của tập hợp là chính nó, do đề bài yêu cầu tính tổng các đỉnh thành phần
for (int i = 1; i <= n; i++){
parent[i] = i;
sz[i] = i;
}
}
int find(int x){
// Ta sử dụng kĩ thuật nén đường đi để tối ưu
if (parent[x] == x) return x;
int p = find(parent[x]);
parent[x] = p;
return p;
}
void set_union(int a, int b){
// Đặt nút "cha" của b là a
a = find(a); b = find(b);
if (a != b){
/*
Ở đây ta dùng swap để thuận tiện hơn
Thay đổi kích cỡ của tập hợp a
Đặt nút "cha" của b là a
*/
if (sz[a] < sz[b]) swap(a, b);
sz[a] += sz[b];
parent[b] = a;
}
}
void input(){
cin >> n >> q;
make_set();
for (int i = 1; i <= q; i++){
int t, u, v;
cin >> t;
if (t == 1){
// Nối 2 đỉnh u, v
cin >> u >> v;
set_union(u, v);
}
else{
// In ra tổng thành phần của đỉnh u
cin >> u;
cout << sz[find(u)] << endl;
}
}
}
int main(){
input();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbiwgcTsKY29uc3QgaW50IE4gPSAxZTUgKyA1OwppbnQgcGFyZW50W05dLCBzeltOXTsKCnZvaWQgbWFrZV9zZXQoKXsKICAgICAgLy8gxJDhurd0IG7DunQgImNoYSIgY+G7p2EgbeG7l2kgdOG6rXAgaOG7o3AgbMOgIGNow61uaCBuw7MKICAgICAgLy8gVHV5IG5oacOqbiwg4bufIMSRw6J5IHRhIMSR4bq3dCBrw61jaCBj4buhIGPhu6dhIHThuq1wIGjhu6NwIGzDoCBjaMOtbmggbsOzLCBkbyDEkeG7gSBiw6BpIHnDqnUgY+G6p3UgdMOtbmggdOG7lW5nIGPDoWMgxJHhu4luaCB0aMOgbmggcGjhuqduCiAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgICAgIHBhcmVudFtpXSA9IGk7CiAgICAgICAgICAgIHN6W2ldID0gaTsKICAgICAgfQp9CgppbnQgZmluZChpbnQgeCl7CiAgICAgIC8vIFRhIHPhu60gZOG7pW5nIGvEqSB0aHXhuq10IG7DqW4gxJHGsOG7nW5nIMSRaSDEkeG7gyB04buRaSDGsHUKICAgICAgaWYgKHBhcmVudFt4XSA9PSB4KSByZXR1cm4geDsKICAgICAgaW50IHAgPSBmaW5kKHBhcmVudFt4XSk7CiAgICAgIHBhcmVudFt4XSA9IHA7CiAgICAgIHJldHVybiBwOwp9Cgp2b2lkIHNldF91bmlvbihpbnQgYSwgaW50IGIpewogICAgICAvLyDEkOG6t3QgbsO6dCAiY2hhIiBj4bunYSBiIGzDoCBhCiAgICAgIGEgPSBmaW5kKGEpOyBiID0gZmluZChiKTsKICAgICAgaWYgKGEgIT0gYil7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgIOG7niDEkcOieSB0YSBkw7luZyBzd2FwIMSR4buDIHRodeG6rW4gdGnhu4duIGjGoW4KICAgICAgICAgICAgVGhheSDEkeG7lWkga8OtY2ggY+G7oSBj4bunYSB04bqtcCBo4bujcCBhCiAgICAgICAgICAgIMSQ4bq3dCBuw7p0ICJjaGEiIGPhu6dhIGIgbMOgIGEKICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHN6W2FdIDwgc3pbYl0pIHN3YXAoYSwgYik7CiAgICAgICAgICAgIHN6W2FdICs9IHN6W2JdOwogICAgICAgICAgICBwYXJlbnRbYl0gPSBhOwogICAgICB9Cn0KCnZvaWQgaW5wdXQoKXsKICAgICAgY2luID4+IG4gPj4gcTsKICAgICAgbWFrZV9zZXQoKTsKICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKXsKICAgICAgICAgICAgaW50IHQsIHUsIHY7CiAgICAgICAgICAgIGNpbiA+PiB0OwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHQgPT0gMSl7CiAgICAgICAgICAgICAgICAgIC8vIE7hu5FpIDIgxJHhu4luaCB1LCB2CiAgICAgICAgICAgICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgICAgICAgICAgIHNldF91bmlvbih1LCB2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAvLyBJbiByYSB04buVbmcgdGjDoG5oIHBo4bqnbiBj4bunYSDEkeG7iW5oIHUKICAgICAgICAgICAgICAgICAgY2luID4+IHU7CiAgICAgICAgICAgICAgICAgIGNvdXQgPDwgc3pbZmluZCh1KV0gPDwgZW5kbDsKICAgICAgICAgICAgfQogICAgICB9Cn0KCmludCBtYWluKCl7CiAgICAgIGlucHV0KCk7CgogICAgICByZXR1cm4gMDsKfQ==