#include #define rep(i,n) for(int i=0;i<(n);i++) using namespace std; class union_find{ int n; vector p; public: union_find(int n):n(n),p(n,-1){} int find(int u){ return p[u]<0?u:p[u]=find(p[u]); } void unite(int u,int v){ u=find(u); v=find(v); if(u!=v){ if(p[v]> E; rep(i,m){ int u,v; scanf("%d%d",&u,&v); u--; v--; E.emplace(u,v); } vector> F(q); rep(i,q){ int u,v; scanf("%d%d",&u,&v); u--; v--; F[i]={u,v}; E.erase({u,v}); } vector> C(n); rep(u,n) C[u].emplace_back(u); union_find U(n); for(auto [u,v]:E) if(!U.is_same(u,v)) { u=U.find(u); v=U.find(v); U.unite(u,v); vector tmp; merge(C[u].begin(),C[u].end(),C[v].begin(),C[v].end(),back_inserter(tmp)); if(u==U.find(u)) C[u]=tmp; // u が親, v が子 else C[v]=tmp; // v が親, u が子 } vector ans(n,-1); rep(u,n) if(U.is_same(0,u)) ans[u]=q; for(int i=q-1;i>=0;i--){ int u=U.find(F[i].first); int v=U.find(F[i].second); if(!U.is_same(u,v)){ if(U.is_same(0,u) && !U.is_same(0,v)){ for(int w:C[v]) ans[w]=i; } else if(U.is_same(0,v) && !U.is_same(0,u)){ for(int w:C[u]) ans[w]=i; } U.unite(u,v); vector tmp; merge(C[u].begin(),C[u].end(),C[v].begin(),C[v].end(),back_inserter(tmp)); if(u==U.find(u)) C[u]=tmp; else C[v]=tmp; } } for(int u=1;u