This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://yukicoder.me/problems/no/416"
#include <bits/stdc++.h>
#include "Graph/dsu_02_min.hpp"
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int N, M, Q;
cin >> N >> M >> Q;
vector<pair<int,int>> B(M), C(Q);
vector<bool> used(M);
Kruskal_dsu<int> uf(N);
for(auto &&[u, v] : B){
cin >> u >> v;
u--, v--;
}
sort(B.begin(), B.end());
for(auto &&[u, v] : C){
cin >> u >> v;
u--, v--;
int p = lower_bound(B.begin(), B.end(), make_pair(u, v)) - B.begin();
used[p] = true;
}
for(int i = 0; i < M; i++){
if(used[i]) continue;
auto &&[u, v] = B[i];
uf.merge(u, v, Q + 1);
}
for(int i = Q - 1; i >= 0; i--){
auto &&[u, v] = C[i];
uf.merge(u, v, i + 1);
}
for(int i = 1; i < N; i++){
int res = uf.min_edge(0, i);
cout << (res == -1 ? 0 : res > Q ? -1 : res) << '\n';
}
}
#line 1 "Test/yukicoder/yuki0416.test.cpp"
#define PROBLEM "https://yukicoder.me/problems/no/416"
#include <bits/stdc++.h>
#line 1 "Graph/dsu_02_min.hpp"
template <class T> struct Kruskal_dsu {
public:
Kruskal_dsu() : _n(0) {}
Kruskal_dsu(int n) : _n(n), num_component(n), parent_or_size(n, -1),
dat(n, std::numeric_limits<T>::min()) {}
bool merge(int u, int v, T w) {
assert(0 <= u && u < _n);
assert(0 <= v && v < _n);
int x = leader(u), y = leader(v);
if (x == y) return false;
if (-parent_or_size[x] < -parent_or_size[y]) std::swap(x, y);
parent_or_size[x] += parent_or_size[y];
parent_or_size[y] = x;
dat[y] = w;
num_component--;
return true;
}
bool same(int u, int v) {
assert(0 <= u && u < _n);
assert(0 <= v && v < _n);
return leader(v) == leader(u);
}
int leader(int v) {
assert(0 <= v && v < _n);
while(parent_or_size[v] >= 0) v = parent_or_size[v];
return v;
}
int size() {
return num_component;
}
int size(int v) {
assert(0 <= v && v < _n);
return -parent_or_size[leader(v)];
}
T min_edge(int u, int v){
T ans = std::numeric_limits<T>::max();
while(u != v){
if (dat[u] < dat[v]) std::swap(u, v);
ans = dat[u], u = parent_or_size[u];
if(u < 0) return -1;
}
return ans;
}
private:
int _n, num_component;
// root node: -1 * component size
// otherwise: parent
std::vector<int> parent_or_size;
std::vector<T> dat;
};
#line 5 "Test/yukicoder/yuki0416.test.cpp"
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int N, M, Q;
cin >> N >> M >> Q;
vector<pair<int,int>> B(M), C(Q);
vector<bool> used(M);
Kruskal_dsu<int> uf(N);
for(auto &&[u, v] : B){
cin >> u >> v;
u--, v--;
}
sort(B.begin(), B.end());
for(auto &&[u, v] : C){
cin >> u >> v;
u--, v--;
int p = lower_bound(B.begin(), B.end(), make_pair(u, v)) - B.begin();
used[p] = true;
}
for(int i = 0; i < M; i++){
if(used[i]) continue;
auto &&[u, v] = B[i];
uf.merge(u, v, Q + 1);
}
for(int i = Q - 1; i >= 0; i--){
auto &&[u, v] = C[i];
uf.merge(u, v, i + 1);
}
for(int i = 1; i < N; i++){
int res = uf.min_edge(0, i);
cout << (res == -1 ? 0 : res > Q ? -1 : res) << '\n';
}
}