https://www.luogu.com.cn/problem/P1197
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N=200010;
struct node{
int l,r,id;
bool operator<(const node & qwe) const{
return id<qwe.id;
}
}a[N];
int p[2*N],n,m,id[2*N],ans[N*2];
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
void solve()
{ cin>>n>>m;
for(int i=0;i<=n;i++){
p[i]=i;
}
for(int i=1;i<=m;i++){
cin>>a[i].l>>a[i].r;
}
int k=0;cin>>k;
for(int i=1;i<=k;i++){
int s;cin>>s;
id[s]=k-i+1;//该节点编号
}
for(int i=1;i<=m;i++){//不能用的编号
a[i].id=max(id[a[i].l],id[a[i].r]);
}
sort(a+1,a+1+m);//排序
int num=n;
for(int i=0,j=1;i<=k;i++){
for(;a[j].id==i;j++) {//目前可以使用的结点
int z=a[j].l,y=a[j].r;
z=find(z),y=find(y);
if(z==y) continue;
num--;//连通块减去1
p[z]=y;
}
ans[i]=num-(k-i);//(k-i)是被摧毁的星球,不算在内
}
for(int i=k;i>=0;i--) cout<<ans[i]<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
solve();
return 0;
}