1 #include <bits/stdc++.h>
2 using namespace std;
3 struct edge
4 {
5 int v, nxt;
6 }e[400005];
7 int fa[400005], fst[400005], dam[400005], ans[400005];
8 bool vis[400005];
9
10 void addedge(int i, int u, int v)
11 {
12 e[i] = (edge){v, fst[u]}, fst[u] = i;
13 }
14
15 int getfa(int x)
16 {
17 return fa[x] = x == fa[x] ? x : getfa(fa[x]);
18 }
19
20 int main()
21 {
22 int n, m, k, u, v;
23 scanf("%d%d", &n, &m);
24 for(int i = 1; i <= n; ++i)
25 fa[i] = i;
26 for(int i = 1; i <= m; ++i)
27 {
28 scanf("%d%d", &u, &v);
29 ++u, ++v;
30 addedge(i << 1, u, v);
31 addedge(i << 1 | 1, v, u);
32 }
33 scanf("%d", &k);
34 for(int i = 1; i <= k; ++i)
35 {
36 scanf("%d", dam + i);
37 vis[++dam[i]] = true;
38 }
39 for(int i = 1; i <= n; ++i)
40 {
41 if(vis[i]) continue;
42 for(int j = fst[i]; j; j = e[j].nxt)
43 if(!vis[e[j].v])
44 {
45 u = getfa(i), v = getfa(e[j].v);
46 if(u != v) fa[u] = v;
47 }
48 }
49 for(int i = 1; i <= n; ++i)
50 if(fa[i] == i) ++ans[k + 1];
51 ans[k + 1] -= k;
52 for(int i = k; i; --i)
53 {
54 ans[i] = ans[i + 1] + 1;
55 vis[dam[i]] = false;
56 for(int j = fst[dam[i]]; j; j = e[j].nxt)
57 if(!vis[e[j].v])
58 {
59 u = getfa(dam[i]), v = getfa(e[j].v);
60 if(u != v) fa[u] = v, --ans[i];
61 }
62 }
63 for(int i = 1; i <= k + 1; ++i)
64 printf("%d\n", ans[i]);
65 return 0;
66 }