此类删除不好做的题 , 倒过来按插入做 , 并查集维护一下就好 , 每次合并连通块数量 -1
#include<bits/stdc++.h>
#define N 400050
using namespace std;
int fa[N],n,m,p[N],vis[N],cnt,ans[N];
int first[N],next[N],to[N],tot;
int read(){
int cnt=0;char ch=0;
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();
return cnt;
}
void add(int x,int y){
next[++tot]=first[x],first[x]=tot,to[tot]=y;
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void Merge(int x,int y){
x=find(x),y=find(y);
if(x!=y) fa[x]=y,cnt--;
}
int main(){
n=read(),m=read(); cnt=n;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int x=read()+1,y=read()+1;
add(x,y),add(y,x);
} int k=read();
for(int i=1;i<=k;i++) p[i]=read()+1,vis[p[i]]=1;
for(int i=1;i<=n;i++){
if(!vis[i]){
for(int j=first[i];j;j=next[j]){
int t=to[j];
if(!vis[t]) Merge(i,t);
}
}
}
for(int i=k;i>=1;i--){
ans[i]=cnt-i; vis[p[i]]=0;
for(int j=first[p[i]];j;j=next[j]){
int t=to[j]; if(!vis[t]) Merge(p[i],t);
}
} printf("%d\n",cnt);
for(int i=1;i<=k;i++){
printf("%d\n",ans[i]);
}return 0;
}