A了#1和#4,求调qwq
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 1e5+10;
ll n , m , cnt , q;
ll head[N] , tot;
ll d[N] ,d1[N] , d2[N] , X , A , B , maxd;
ll ans;
int a , b , fa[N];
int Find(int x) {
if(fa[x] == x) return x;
return fa[x] = Find(fa[x]);
}
void Union(int x , int y) {
int fx = Find(x) , fy = Find(y);
if(fx != fy) fa[fx] = fy;
d[fy] = max(d[fx] , max(d[fy] , (d[fx] + 1) / 2 + (d[fy] + 1) / 2 + 1));
}
void init() {
for(int i = 1 ; i <= N ; i++) {
fa[i] = i;
}
memset(head , -1 , sizeof head);
tot = 0;
}
struct zzc {
ll to , w , next;
}edge[N*2];
void add(ll x ,ll y) {
edge[tot].to = y;
edge[tot].next = head[x];
head[x] = tot++;
}
void add_ (ll x , ll y) {
add(x , y);
add(y , x);
}
void dfs(ll u, ll fa , ll rt) {
for(int i = head[u] ; ~i ; i = edge[i].next) {
ll v = edge[i].to , w = edge[i].w;
if(v == fa) continue;
dfs(v , u , rt);
if(d1[v] +w > d1[u]) {
d2[u] = d1[u];
d1[u] = d1[v] + w;
}
else if(d1[v] + w > d2[u]) {
d2[u] = d1[v] + w;
}
}
maxd = max(maxd , d1[u] + d2[u]);
d[rt] = maxd;
}
int main() {
init();
cin >> n >> m >> q;
for(int i = 1 ; i <= m; i ++) {
ll x , y;
cin >> x >> y;
Union(x , y);
// add_(x , y);
}
// for(int i = 1 ; i <= m ; i ++) {
// dfs(i , - , Find(i));
// }
for(int i = 1 ; i <= q ; i++) {
ll op = 0 , x , y;
cin >> op;
if(op == 1) {
cin >> x;
cout << d[Find(x)] << '\n';
}
else {
cin >> x >> y;
Union(x , y);
}
}
}