好神奇的一道题 不多说 最后一次询问暴力并查集
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline int read(int &x)
{
static char c=getchar();
for (;!(c>='0' && c<='9');c=getchar()) if (c=='\n' || c==EOF) return c=getchar(),0;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=getchar()); return 1;
}
const int N=500005;
int n,m;
int u[N],v[N];
int num,del[N],pnt;
int fat[N];
inline int Fat(int u){
return u==fat[u]?u:fat[u]=Fat(fat[u]);
}
inline void Union(int u,int v){
int fx=Fat(u),fy=Fat(v);
if (fx!=fy) fat[fx]=fy;
}
int main()
{
int Q,K,last=0;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) scanf("%d%d",&u[i],&v[i]);
scanf("%d",&Q);
for (int i=1;i<=Q;i++)
{
while (!read(K));
for (num=1;read(del[num]);num++); num--;
if (i>1)
{
if ((K^last)==num)
printf("Disconnected\n");
else
printf("Connected\n"),last++;
}
}
for (int i=1;i<=num;i++) del[i]^=last;
sort(del+1,del+num+1); pnt=1;
for (int i=1;i<=n;i++) fat[i]=i;
for (int i=1;i<=num;i++)
if (del[pnt]==i)
pnt++;
else
Union(u[i],v[i]);
int f1=Fat(1);
for (int i=2;i<=n;i++)
if (Fat(i)!=f1)
return printf("Disconnected\n"),0;
printf("Connected\n");
return 0;
}