#include <bits/stdc++.h>
using namespace std;
const int N = 512, M = 20000 + 10;
struct Stage {
  int p[N];
} stage[N * 2];
struct Edge {
  int u, v;
  void init() { scanf("%d%d", &u, &v); }
} edge[M];
int preStg[M], postStg[M], nstg;
int p[N], num[N];
int n, m;
int findr(int x, int* P) {
  int r = x;
  while (P[r]) r = P[r];
  while (P[x]) {
    int t = P[x];
    P[x] = r;
    x = t;
  }
  return r;
}
void join(int x, int y, int* P) {
  int r1 = findr(x, P);
  int r2 = findr(y, P);
  if (r1 == r2) return;
  if (num[r1] > num[r2]) {
    num[r1] += num[r2];
    P[r2] = r1;
  } else {
    num[r2] += num[r1];
    P[r1] = r2;
  }
}
int l, r;
int solve() {
  Stage st1 = stage[preStg[l]];
  Stage st2 = stage[postStg[r]];
  memset(num, 0, sizeof(num));
  for (int i = 1; i <= n; ++i) {
    join(i, st2.p[i], st1.p);
  }
  int sum = 0;
  for (int i = 1; i <= n; ++i) {
    sum += (findr(i, st1.p) == i);
  }
  return sum;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    edge[i].init();
  }
  memset(p, 0, sizeof(p));
  memset(num, 0, sizeof(num));
  for (int i = 1; i <= n; ++i) {
    stage[nstg].p[i] = p[i];
  }
  nstg++;
  for (int i = 1; i <= m; ++i) {
    preStg[i] = nstg - 1;
    if (findr(edge[i].u, p) != findr(edge[i].v, p)) {
      join(edge[i].u, edge[i].v, p);
      for (int j = 1; j <= n; ++j) {
        stage[nstg].p[j] = p[j];
      }
      nstg++;
    }
  }
  memset(p, 0, sizeof(p));
  memset(num, 0, sizeof(num));
  for (int i = 1; i <= n; ++i) {
    stage[nstg].p[i] = p[i];
  }
  nstg++;
  for (int i = m; i >= 1; --i) {
    postStg[i] = nstg - 1;
    if (findr(edge[i].u, p) != findr(edge[i].v, p)) {
      join(edge[i].u, edge[i].v, p);
      for (int j = 1; j <= n; ++j) {
        stage[nstg].p[j] = p[j];
      }
      nstg++;
    }
  }
  int q;
  scanf("%d", &q);
  while (q--) {
    scanf("%d %d", &l, &r);
    printf("%d\n", solve());
  }
  return 0;
}
