Judgelight @ 2022-10-26 22:11:48
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define int long long
#define N 400009
#define M 400009
using namespace std;
int n,m,x,y,k,he[N],cnt,fa[N],vis[N],ans[N],distroy[N],jl[N],now,light[N],con;
int get(int x){
return fa[x]==x?x:fa[x]=get(fa[x]);
}
struct Edge{
int ne,to,flag;
}e[N];
void add(int u,int v){
e[++cnt].ne=he[u];
e[cnt].to=v;
he[u]=cnt;
}
void dfs(int u){
vis[u]=1;
light[u]=1;
for(int i=he[u];i;i=e[i].ne){
int v=e[i].to;
int fx=get(u),fy=get(v);
fa[fx]=fy;
if(vis[v]){
continue;
}
dfs(v);
}
}
inline void init(){
for(int i=1;i<=n;i++){
fa[i]=i;
}
}
signed main(){
cin>>n>>m;
init();
for(int i=1;i<=m;i++){
cin>>x>>y;
x++,y++;
add(x,y);
add(y,x);
}
cin>>k;
for(int i=1;i<=k;i++){
cin>>x;
x++;
distroy[i]=x;
vis[x]=1;
for(int j=he[x];j;j=e[j].ne){
e[j].flag=1;
}
}
for(int i=1;i<=n;i++){
if(!vis[i]){
con++;
dfs(i);
}
}
ans[k+1]=con;
for(int i=k;i>=1;i--){
int u=distroy[i];
int flag=0;
now=0;
for(int j=he[u];j;j=e[j].ne){
jl[++now]=e[j].to;
}
light[u]=1;
for(int j=1;j<now;j++){
int fx=get(jl[j]),fy=get(jl[j+1]);
if(light[jl[j]]||light[jl[j+1]]){
flag=1;
}
if(fx!=fy&&light[jl[j]]&&light[jl[j+1]]){
con--;
}
}
if(flag==0){
con++;
}
for(int j=1;j<now;j++){
int fx=get(jl[j]),fy=get(jl[j+1]);
fa[fx]=fy;
}
for(int j=1;j<=now;j++){
light[jl[j]]=1;
}
ans[i]=con;
}
for(int i=1;i<=k+1;i++){
cout<<ans[i]<<endl;
}
return 0;
}