#include #include using namespace std; using namespace atcoder; // using mint = modint1000000007; // const int mod = 1000000007; // using mint = modint998244353; // const int mod = 998244353; // const int INF = 1e9; // const long long LINF = 1e18; #define rep(i, n) for (int i = 0; i < (n); ++i) #define rep2(i, l, r) for (int i = (l); i < (r); ++i) #define rrep(i, n) for (int i = (n)-1; i >= 0; --i) #define rrep2(i, l, r) for (int i = (r)-1; i >= (l); --i) #define all(x) (x).begin(), (x).end() #define allR(x) (x).rbegin(), (x).rend() #define P pair template inline bool chmax(A &a, const B &b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(A &a, const B &b) { if (a > b) { a = b; return true; } return false; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n, m, q; cin >> n >> m >> q; vector

e(m); rep(i, m) { int a, b; cin >> a >> b; --a, --b; if (a > b) swap(a, b); e[i] = { a, b }; } vector

ord = e; sort(ord.begin(), ord.end()); vector used(m, 0); vector

e2(q); rep(i, q) { int u, v; cin >> u >> v; --u, --v; if (u > v) swap(u, v); int idx = lower_bound(ord.begin(), ord.end(), make_pair(u, v)) - ord.begin(); used[idx] = 1; e2[i] = { u, v }; } // 元の辺 -> sorted後の位置対応 vector alive(m, 1); rep(i, m) { auto[u, v] = ord[i]; if (used[i]) alive[i] = 0; } dsu uf(n); vector> mem(n); rep(i, n) mem[i] = { i }; vector ans(n, -1); auto merge_comp = [&](int a, int b, int tim) { a = uf.leader(a); b = uf.leader(b); if (a == b) return; bool ca = uf.same(a, 0); bool cb = uf.same(b, 0); if (mem[a].size() < mem[b].size()) { swap(a, b); swap(ca, cb); } uf.merge(a, b); int r = uf.leader(a); if (r != a) { swap(mem[a], mem[b]); swap(a, b); swap(ca, cb); } // a が新 leader if (ca && !cb) { for (int x : mem[b]) ans[x] = tim; } else if (!ca && cb) { for (int x : mem[a]) ans[x] = tim; } mem[a].insert(mem[a].end(), mem[b].begin(), mem[b].end()); vector().swap(mem[b]); }; // 全削除後のグラフを構築 rep(i, m) if (alive[i]) { auto[u, v] = ord[i]; merge_comp(u, v, -1); } // 全削除後でも 1 と連結な頂点 int root0 = uf.leader(0); for (int x : mem[root0]) ans[x] = q + 1; // 逆順に辺を戻す for (int i = q - 1; i >= 0; --i) { auto[u, v] = e2[i]; merge_comp(u, v, i + 1); } rep2(i, 1, n) { if (!uf.same(0, i))cout << 0 << endl; else if (ans[i] == q + 1)cout << -1 << endl; else cout << ans[i] << endl;; } return 0; }