#define PROBLEM "https://yukicoder.me/problems/no/416"
#include<bits/stdc++.h>#include"library/datastructure/unionfind/PartialPersistentUnionFind.hpp"intmain(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);intn,m,q;std::cin>>n>>m>>q;PartialPersistentUnionFinduf(n);std::set<std::pair<int,int>>edge;while(m--){inta,b;std::cin>>a>>b;a--;b--;edge.insert(std::minmax(a,b));}std::vector<std::pair<int,int>>query(q);for(inti=0;i<q;i++){inta,b;std::cin>>a>>b;a--;b--;edge.erase(std::minmax(a,b));query[i]=std::minmax(a,b);}for(constauto&[a,b]:edge)uf.merge(a,b);std::map<int,int>time;while(q--){auto[a,b]=query[q];intnow=uf.merge(a,b);time[now]=q+1;}for(inti=1;i<n;i++){intt=uf.when_same(0,i);if(t==-1)std::cout<<0<<"\n";elseif(!time.count(t))std::cout<<-1<<"\n";elsestd::cout<<time[t]<<"\n";}}
#line 1 "test/yukicoder/416.test.cpp"
#define PROBLEM "https://yukicoder.me/problems/no/416"
#include<bits/stdc++.h>#line 2 "library/datastructure/unionfind/PartialPersistentUnionFind.hpp"
// https://tiramister.net/blog/posts/persistent-unionfind/classPartialPersistentUnionFind{intnow;// 現在時刻std::vector<int>par,rank,time;std::vector<std::vector<std::pair<int,int>>>sz;staticconstexprintNOW=std::numeric_limits<int>::max();public:PartialPersistentUnionFind(intn):now(0),par(n),rank(n,0),time(n,0),sz(n){std::iota(par.begin(),par.end(),0);}// 時刻 t の leaderintfind(intx,intt=NOW){while(x!=par[x]andtime[x]<t)x=par[x];returnx;}// 時刻 t で x,y が連結かboolsame(intx,inty,intt=NOW){returnfind(x,t)==find(y,t);}// x と y がいつ連結になったか(まだ非連結なら -1 )// stack を使う実装も考えたけど少し遅そう atcoder/submissions/37116694intwhen_same(intx,inty){intdiff=0;// x の深さ - y の深さintX=x,Y=y;while(par[x]!=x){x=par[x];diff++;}while(par[y]!=y){y=par[y];diff--;}if(x!=y)return-1;intres=0;while(X!=Y){if(diff>0){res=std::max(res,time[X]);X=par[X];diff--;}else{res=std::max(res,time[Y]);Y=par[Y];diff++;}}returnres;}// merge が成功したら時刻を 1 進めたあとその時刻を返す// 失敗したら stop が false なら時刻を進めて、-1 を返すintmerge(intx,inty,boolstop=false){now++;x=find(x);y=find(y);if(x==y){if(stop)now--;return-1;}if(rank[x]<rank[y])std::swap(x,y);sz[x].emplace_back(now,size(x)+size(y));if(rank[x]==rank[y])rank[x]++;par[y]=x;returntime[y]=now;}// 時刻 t の連結成分 x のサイズintsize(intx,intt=NOW){x=find(x,t);intok=-1,ng=sz[x].size();while(ng-ok>1){intmid=(ok+ng)>>1;(sz[x][mid].first<=t?ok:ng)=mid;}return(~ok?sz[x][ok].second:1);}};#line 5 "test/yukicoder/416.test.cpp"
intmain(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);intn,m,q;std::cin>>n>>m>>q;PartialPersistentUnionFinduf(n);std::set<std::pair<int,int>>edge;while(m--){inta,b;std::cin>>a>>b;a--;b--;edge.insert(std::minmax(a,b));}std::vector<std::pair<int,int>>query(q);for(inti=0;i<q;i++){inta,b;std::cin>>a>>b;a--;b--;edge.erase(std::minmax(a,b));query[i]=std::minmax(a,b);}for(constauto&[a,b]:edge)uf.merge(a,b);std::map<int,int>time;while(q--){auto[a,b]=query[q];intnow=uf.merge(a,b);time[now]=q+1;}for(inti=1;i<n;i++){intt=uf.when_same(0,i);if(t==-1)std::cout<<0<<"\n";elseif(!time.count(t))std::cout<<-1<<"\n";elsestd::cout<<time[t]<<"\n";}}