1 #include <cstdio>
2 #include <vector>
3 #include <algorithm>
4 using namespace std;
5 const int maxn=400005;
6 vector <int> e[maxn];
7 int pa[maxn],rank[maxn],x[maxn],d[maxn],num[maxn];
8 void init(int n)
9 {
10 for(int i=1;i<=n;i++)
11 {
12 pa[i]=i;
13 }
14 }
15 int find(int x)
16 {
17 if(pa[x]==x) return x;
18 else return pa[x]=find(pa[x]);
19 }
20 void unite(int x,int y)
21 {
22 x=find(x);
23 y=find(y);
24 if(x==y) return;
25 if(rank[x]>rank[y]) pa[y]=x;
26 else
27 {
28 pa[x]=y;
29 if(rank[x]==rank[y]) rank[x]++;
30 }
31 }
32 bool same(int x,int y)
33 {
34 return find(x)==find(y);
35 }
36 int main()
37 {
38 int n,m,Ans=0,a,b;
39 scanf("%d%d",&n,&m);
40 init(n);
41 for(int i=1;i<=m;i++)
42 {
43 scanf("%d%d",&a,&b);
44 a++;
45 b++;//序号从0开始
46 e[a].push_back(b);
47 e[b].push_back(a);
48 }
49 int k;
50 scanf("%d",&k);
51
52 //离线倒处理
53 for(int i=1;i<=k;i++)
54 {
55 scanf("%d",&x[k-i+1]);
56 x[k-i+1]++;//序号从0开始
57 d[x[k-i+1]]=1;
58 }
59
60 //开始时连通分量数
61 for (int i=1;i<=n;i++)
62 if (d[i]==0)
63 for (int j=0;j<e[i].size();j++)
64 {
65 int v=e[i][j];
66 if (d[v]==0)
67 unite(i,v);
68 }
69 for (int i=1;i<=n;i++)
70 {
71 if((find(i)==i)&&(d[i]==0))
72 Ans++;
73 }
74
75 //更新
76 for(int i=1;i<=k;i++)
77 {
78 int u=x[i];
79 d[u]=0;
80 num[i]=Ans;
81 Ans++;
82 for(int j=0;j<e[u].size();j++)
83 {
84 int v=e[u][j];
85 if(d[v]==0)
86 {
87 if(!same(u,v))
88 {
89 unite(u,v);
90 Ans--;
91 }
92 }
93 }
94 }
95 num[k+1]=Ans;
96 for(int i=k+1;i>=1;i--)
97 {
98 printf("%d\n",num[i]);
99 }
100 return 0;
101 }