gaojizhe05 @ 2024-07-04 19:00:51
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int n,m,a,b,k,f[maxn],fa[maxn],ans[maxn],cnt,t[maxn];
vector <int> e[maxn];
bool vis[maxn],isf[maxn],tag_fa[maxn];
bool con;
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
fa[fx]=fy;
if(con) cnt--;
else con=1;
}
}
void dfs(int u,int v){
if(vis[u]||isf[u]) return;
vis[u]=1;
fa[u]=v;
for(int i=0;i<e[u].size();i++) dfs(e[u][i],u);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
e[a].push_back(b);
e[b].push_back(a);
}
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&f[i]);
isf[f[i]]=1,t[f[i]]=i;
}
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++) dfs(i,i);
for(int i=1;i<=n;i++)
if(!tag_fa[fa[i]]) tag_fa[fa[i]]=1,cnt++;
cnt-=k;
ans[k+1]=cnt;
for(int i=k;i>=1;i--){
con=0;
for(int j=0;j<e[f[i]].size();j++)
if(!(isf[e[f[i]][j]]&&t[e[f[i]][j]]<i)) merge(f[i],e[f[i]][j]);
ans[i]=cnt;
}
for(int i=1;i<=k+1;i++) printf("%d\n",ans[i]);
return 0;
}