int n, m, q; int u[kMaxN], v[kMaxN], s[kMaxN], d[kMaxN]; std::vector<int> G[kMaxN], nG[kMaxN];
intbfs(){ std::fill(d + 1, d + 1 + n, -1); std::queue<int> q; q.emplace(1), d[1] = 0; while (!q.empty()) { int u = q.front(); q.pop(); for (auto v : nG[u]) { if (!~d[v]) { q.emplace(v), d[v] = d[u] + 1; } } } return *std::max_element(d + 1, d + 1 + n); }
intget(int x){ if (~s[x]) return s[x]; for (int i = 1; i <= n; ++i) nG[i] = G[i]; for (int i = 1; i <= x; ++i) nG[u[i]].emplace_back(v[i]), nG[v[i]].emplace_back(u[i]); return s[x] = bfs(); }
voiddickdreamer(){ std::cin >> n >> m >> q; for (int i = 1; i <= m; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v), G[v].emplace_back(u); } for (int i = 1; i <= q; ++i) std::cin >> u[i] >> v[i]; std::fill(s, s + 1 + q, -1); for (int i = 0, j = 0; i <= q; i = j + 1) { int L = i - 1, R = q + 1; while (L + 1 < R) { int mid = (L + R) >> 1; if (get(mid) >= (get(i) + 1) / 2) L = j = mid; else R = mid; } for (int k = i; k <= j; ++k) std::cout << get(i) << ' '; } }