删边就倒着建边,拿并查集一合并,维护一个size就好
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200005;
struct edge
{
int to,next;
}e[maxn<<1];
int n,m;
int fa[maxn],add[maxn],size[maxn],head[maxn];
bool vst[maxn],ans[maxn];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void insert(int a,int b)
{
static int cnt=0;
e[++cnt].to=b;e[cnt].next=head[a];head[a]=cnt;
}
void union_set(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)return;
fa[x]=y;
size[y]+=size[x];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
insert(a,b);
insert(b,a);
}
for(int i=1;i<=n;i++)
scanf("%d",add+i);
for(int i=1;i<=n;i++)fa[i]=i,size[i]=1;
vst[add[n]]=true;
ans[n]=true;
for(int i=n-1;i>=1;i--)
{
vst[add[i]]=true;
for(int j=head[add[i]];j;j=e[j].next)
if(vst[e[j].to])
union_set(add[i],e[j].to);
ans[i]=size[find(add[i])]==n-i+1?true:false;
}
for(int i=1;i<=n;i++)
puts(ans[i]?"YES":"NO");
}