#include using namespace std; typedef long long int ll; typedef double ld; typedef vector vi; typedef vector Graph; // push_back insert lower_bound upper_bound erase //unionfind struct Uf{ vector p, r; // p=element's parent, r=rank Uf(ll n):p(n),r(n){ iota(p.begin(), p.end(), 0); } // finds representant of a's set ll find(ll a){ return p[a]==a ? a : p[a]=find(p[a]); } // unifies sets of a and b void uni(ll a, ll b){ a = find(a); b = find(b); if(a==b)return; if(r[a]> edges; vi v, inv, big; void check(ll idx, ll mx){ mx = min(mx, M-idx); ll sz=0; Uf uf(2*mx); unordered_map m; for(ll i=0; i> N >> M; g = Graph(N); for(ll i=0; i> a >> b; --a; --b; edges.push_back({a,b}); g[a].push_back(b); g[b].push_back(a); } ll Q; cin >> Q; vector> q(Q); for(auto &p:q) cin >> p.first >> p.second; for(auto &p:q) --p.first, --p.second; inv = v = big = vi(M, 0); /* ll bound=max(1,((int)ceil(sqrt(N)))); */ ll bound=M; for(ll i=0; i