#include #include #include #include int main() { int N, M; std::cin >> N >> M; std::vector U(M), V(M); std::vector usable(M, true); for (int i = 0; i < M; i++) { int u, v; std::cin >> u >> v; u--; v--; U[i] = u; V[i] = v; } int Q; std::cin >> Q; std::stack queries; while (Q--) { int B; std::cin >> B; B--; queries.push(B); usable[B] = false; } atcoder::dsu dsu(N); for (int i = 0; i < M; i++) { if (usable[i]) dsu.merge(U[i], V[i]); } int64_t count = 0; std::stack output; for (int i = 0; i < N; i++) { if (dsu.leader(i) == i) count += dsu.size(i) * int64_t(dsu.size(i) - 1) / 2; } output.push(count); while (queries.size() > 1) { int i = queries.top(); queries.pop(); if (dsu.same(U[i], V[i])) { output.push(count); } else { count += int64_t(dsu.size(U[i])) * dsu.size(V[i]); output.push(count); dsu.merge(U[i], V[i]); } } while (!output.empty()) { std::cout << N * int64_t(N - 1) / 2 - output.top() << std::endl; output.pop(); } }