#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // #include #include // #include #include using namespace atcoder; using namespace std; using ll = long long; using ull = unsigned long long; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; ll ll_min = numeric_limits::min(); ll ll_max = numeric_limits::max(); ll ALPHABET_N = 26; static const ll INF = ll_min / 10; // using mint = modint1000000007; #define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++) #define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++) #define all(a) a.begin(), a.end() int main() { ll n, m; cin >> n >> m; vector U(m), V(m); rep(i, m) cin >> U[i] >> V[i]; ll q; cin >> q; vector B(q); rep(i, q) { cin >> B[i]; B[i]--; } reverse(all(B)); vector ans; dsu d(n); set unused; rep(i, q) unused.insert(i); for (auto b : B) { unused.erase(b); } for (auto u : unused) { d.merge(U[u] - 1, V[u] - 1); } ll cur = n * (n - 1) / 2; for (auto g : d.groups()) { cur -= g.size() * (g.size() - 1) / 2; } for (auto b : B) { ans.push_back(cur); if (!d.same(U[b] - 1, V[b] - 1)) { ll size_u = d.size(U[b] - 1); ll size_v = d.size(V[b] - 1); cur -= size_u * size_v; d.merge(U[b] - 1, V[b] - 1); } } reverse(all(ans)); for (auto a : ans) { cout << a << endl; } return 0; }