Solution:
并不是不会合并并查集.
而是数组开小了哦.
然后并不是RE了哟.
WAWAWAWA
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int MAXN=500;
const int MAXM=20000;
int n,m,k;
int u[MAXM+10],v[MAXM+10];
int s0[MAXM+10][MAXN+10],s1[MAXM+10][MAXN+10];
int p[MAXN+10];
int* fa;
int find(int x){return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void hb(int x,int y)
{
x=find(x);y=find(y);
if(x!=y)fa[x]=y;
}
int main(void)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)scanf("%d%d",u+i,v+i);
for(int i=1;i<=n;++i)s0[0][i]=s1[m+1][i]=i;
for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)s0[i][j]=s0[i-1][j];
fa=s0[i];
hb(u[i],v[i]);
for(int j=1;j<=n;++j)find(j);
}
for(int i=m;i;--i)
{
for(int j=1;j<=n;++j)s1[i][j]=s1[i+1][j];
fa=s1[i];
hb(u[i],v[i]);
for(int j=1;j<=n;++j)find(j);
}
scanf("%d",&k);
while(k--)
{
int l,r;
scanf("%d%d",&l,&r);
for(int i=1;i<=n;++i)p[i]=i;
fa=p;
for(int i=1;i<=n;++i)hb(s0[l-1][i],i);
for(int i=1;i<=n;++i)hb(s1[r+1][i],i);
int ans=0;
for(int i=1;i<=n;++i)if(p[i]==i)++ans;
printf("%d
",ans);
}
return 0;
}