并查集预处理+暴力
/**
* Created by ckboss on 14-9-8.
*/
import java.util.*;
import java.io.*;
public class ConnectedComponents {
static class Edge{
int u,v;
}
static final int maxn=11000;
static Edge[] edge=new Edge[maxn];
static int[] fa=new int[600];
static int n,m,q;
static int Find(int x){
if(x==fa[x]){
return x;
}
return fa[x]=Find(fa[x]);
}
static boolean Union(int x,int y){
int X=Find(x),Y=Find(y);
if(X==Y) return false;
fa[X]=Y;
return true;
}
static int[] front=new int[maxn],back=new int[maxn];
static int nf,nb;
public static void main(String[] args){
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
Scanner in = new Scanner(inputStream);
PrintWriter out = new PrintWriter(outputStream);
n=in.nextInt(); m=in.nextInt();
for(int i=1;i<=m;i++){
edge[i]=new Edge();
edge[i].u=in.nextInt();
edge[i].v=in.nextInt();
}
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
if(Union(edge[i].u,edge[i].v)==true){
front[nf++]=i;
}
}
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=m;i>=1;i--){
if(Union(edge[i].u,edge[i].v)==true){
back[nb++]=i;
}
}
q=in.nextInt();
while(q-->0){
int l,r;
l=in.nextInt();r=in.nextInt();
for(int i=1;i<=n;i++){
fa[i]=i;
}
int t=n;
for(int i=0;i<nf&&front[i]<l;i++){
if(Union(edge[front[i]].u,edge[front[i]].v)==true){
t--;
}
}
for(int i=0;i<nb&&back[i]>r;i++){
if(Union(edge[back[i]].u,edge[back[i]].v)==true){
t--;
}
}
System.out.println(t);
}
}
}