![]()
![]()
1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<cstring>
5 #include<cmath>
6 using namespace std;
7 const int maxn=5e5+7;
8 int n,m,num,k,tot;
9 int head[maxn],p[maxn],fa[maxn],ans[maxn];
10 bool del[maxn],usd[maxn];
11 struct Edge{
12 int nxt,to,dis;
13 }edge[maxn];
14 void add(int from,int to){
15 edge[++num].nxt=head[from];
16 edge[num].to=to;
17 head[from]=num;
18 }
19 int find(int x){
20 if(x==fa[x]) return x;
21 return fa[x]=find(fa[x]);
22 }
23 void ins(int x){
24 for(int i=head[x];i;i=edge[i].nxt){
25 int v=edge[i].to;
26 if(usd[v]){
27 int fx=find(x);int fv=find(v);
28 if(fx!=fv){
29 tot--;fa[fx]=fv;
30 }
31 }
32 }
33 }
34 int main(){
35 cin>>n>>m;
36 for(int i=0;i<n;i++) fa[i]=i;
37 for(int i=1;i<=m;i++){
38 int u,v;cin>>u>>v;
39 add(u,v);add(v,u);
40 }
41 cin>>k;
42 for(int i=1;i<=k;i++){
43 cin>>p[i];del[p[i]]=true;
44 }
45 for(int i=0;i<n;i++){
46 if(!del[i]){
47 tot++;
48 ins(i);
49 usd[i]=true;
50 }
51 }
52 ans[k+1]=tot;
53 for(int i=k;i>=1;i--){
54 tot++;
55 ins(p[i]);
56 usd[p[i]]=true;
57 ans[i]=tot;
58 }
59 for(int i=1;i<=k+1;i++) cout<<ans[i]<<endl;
60 return 0;
61 }