#include #include #include #include using namespace std; using ll = long long; using P = pair; struct UnionFind{ vector par, siz, rank; UnionFind(int n) : par(n, -1), siz(n, 1), rank(n, 1) {} //メンバ変数をどのように初期化するかを表す //根を求めるやつ int root(int x){ if(par[x]==-1) return x; else return par[x]=root(par[x]); } //xを含むグループとyを含むグループとを併合する bool unite(int x, int y){ x=root(x); y=root(y); if(x==y) return false; if(rank[x]> n >> m; vector

bri; for(int i=0; i> u >> v; u--, v--; bri.emplace_back(u, v); } int q; cin >> q; vector cant(m), briidx; for(int i=0; i> b; b--; cant[b]++; briidx.push_back(b); } UnionFind uf(n); for(int i=0; i ans(q); vector checked(n, false); for(int i=0; i=0; i--){ ans[i]=allpair-now; auto [u, v]=bri[briidx[i]]; u=uf.root(u), v=uf.root(v); if(u==v) continue; ll p=uf.size(u), q=uf.size(v); now+=p*q; uf.unite(u, v); } for(auto p:ans) cout << p << endl; return 0; }