rt
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, m, q, cnt, len;
array<int, N> fa;
vector<int> e[N];
array<int, N> f, g, l;
array<bool, N> vis;
void Add(int x, int y)
{
e[x].push_back(y);
e[y].push_back(x);
}
int Find(int x)
{
if (fa[x] != x) fa[x] = Find(fa[x]);
return fa[x];
}
void Merge(int x, int y)
{
int fx = Find(x), fy = Find(y);
if (fx != fy)
fa[fx] = fy;
}
void Dfs(int u, int F)
{
f[u] = g[u] = -1;
for (int v : e[u])
{
if (v == F) continue;
Dfs(u, v);
if (f[v] + 1 > f[u])
g[u] = f[u], f[u] = f[v] + 1;
else if (f[v] + 1 > g[u])
g[u] = f[v] + 1;
}
len = max(len, max(max(0, f[u] + g[u]), max(f[u], g[u])));
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m >> q;
for (int i = 1; i <= n; i++)
fa[i] = i;
for (int i = 1; i <= m; i++)
{
int x, y; cin >> x >> y;
Add(x, y), Merge(x, y);
}
for (int i = 1; i <= n; i++)
{
if (!vis[i] && fa[i] == i)
{
len = 0;
Dfs(i, 0);
l[i] = len, vis[i] = 1;
}
}
while (q--)
{
int op; cin >> op;
if (op == 1)
{
int x; cin >> x;
cout << l[Find(x)] << '\n';
}
else
{
int x, y; cin >> x >> y;
int fx = Find(x), fy = Find(y);
if (fx == fy) continue;
len = max((l[fx] + 1) / 2 + (l[fy] + 1) / 2 + 1, max(l[fx], l[fy]));
Merge(x, y); l[Find(x)] = len;
}
}
return 0;
}
https://www.luogu.com.cn/record/168467287 (怀疑是递归爆栈了)