#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; class UnionFindTree { private: const int n; vector parent; // 親ノード vector > child; // 子ノード vector rank; // 木の高さの上限 int find(int i){ if(parent[i] == i){ return i; } else{ child[parent[i]].erase(i); parent[i] = find(parent[i]); child[parent[i]].insert(i); return parent[i]; } } public: UnionFindTree(int n) : n(n){ // コンストラクタ parent.resize(n); child.resize(n); for(int i=0; i& group){ // グループ構成を返す set s; queue q; s.insert(a); q.push(a); while(!q.empty()){ int x = q.front(); q.pop(); if(s.find(parent[x]) == s.end()){ s.insert(parent[x]); q.push(parent[x]); } for(int y : child[x]){ if(s.find(y) == s.end()){ s.insert(y); q.push(y); } } } group = vector(s.begin(), s.end()); } }; int main() { int n, m, q; cin >> n >> m >> q; set > s; for(int i=0; i> a >> b; -- a; -- b; s.insert(make_pair(a, b)); } vector c(q), d(q); for(int i=0; i> c[i] >> d[i]; -- c[i]; -- d[i]; s.erase(make_pair(c[i], d[i])); } UnionFindTree uft(n); for(const auto& p : s) uft.unite(p.first, p.second); vector ans(n, 0); vector v; uft.getGroup(0, v); for(unsigned i=0; i=0; --i){ if(uft.same(c[i], d[i])) continue; vector v; if(uft.same(0, c[i])) uft.getGroup(d[i], v); else if(uft.same(0, d[i])) uft.getGroup(c[i], v); for(unsigned j=0; j