#if __has_include() #include using namespace atcoder; #else #include #if __has_include() #include using namespace atcoder; #endif #endif using namespace std; #define int long long #define all(x) (x).begin(), (x).end() #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rrep(i, n) for(int i = (int)(n - 1); i >= 0; i--) template bool chmax(T &a,const T &b){if(a bool chmin(T &a,const T &b){if(a>b){a=b;return true;}return false;} // using mint = modint; signed main(){ int n, m; cin >> n >> m; vector> uv(m); for(auto&& [u, v] : uv) cin >> u >> v, u--, v--; int q; cin >> q; vector b(q); vector uv_default(m, true); // 最初からある辺はtrue for(auto&& bi : b){ cin >> bi; bi--; uv_default.at(bi) = false; } dsu d(n); rep(i, m) if(uv_default.at(i)){ auto [u, v] = uv.at(i); d.merge(u, v); } int size_sq_sum = 0; auto vv = d.groups(); for(const auto& v : vv) size_sq_sum += v.size() * v.size(); vector ans(q); rrep(i, q){ ans.at(i) = (n * n - size_sq_sum) / 2; auto [u, v] = uv.at(b.at(i)); if(!d.same(u, v)){ int size_u = d.size(u), size_v = d.size(v), size_after = size_u + size_v; size_sq_sum -= size_u * size_u + size_v * size_v; size_sq_sum += size_after * size_after; } d.merge(u, v); } for(auto i : ans) cout << i << '\n'; } /* 逆順に辺を追加していく 答えは、(各連結成分のsize * (n - size)の総和)/2 sum(size * (n - size)) = n * n - sum(size * size); 例えば、 1 1 1 1 1→2 1 1 1のとき、 答えは 10→9 n=5 6+4+4+4 */