#include <bits/stdc++.h>
using namespace std;
struct ufds {
  vector<int> p, rank;
  int c;
  void init(int n) {
    p.resize(n);
    rank.assign(n, 0);
    for (int i = 0; i < n; i++) p[i] = i;
    c = n - 1;
  }
  int find(int i) { return (p[i] == i) ? i : (p[i] = find(p[i])); }
  bool sameset(int x, int y) { return find(x) == find(y); }
  void u(int x, int y) {
    if (!sameset(x, y)) {
      c--;
      int px, py;
      px = find(x);
      py = find(y);
      if (rank[px] > rank[py])
        p[py] = px;
      else {
        p[px] = py;
        if (rank[px] == rank[py]) rank[py]++;
      }
    }
  }
};
ufds dp[10001], dp1[10001];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  vector<pair<int, int>> ed;
  ed.resize(m + 1);
  int f, to;
  ufds s;
  s.init(n + 1);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &f, &to);
    dp[i].p = s.p;
    dp[i].rank = s.rank;
    dp[i].c = s.c;
    ed[i] = {f, to};
    s.u(f, to);
  }
  ufds s1;
  s1.init(n + 1);
  for (int i = m; i >= 1; i--) {
    dp1[i].p = s1.p;
    dp1[i].rank = s1.rank;
    dp1[i].c = s1.c;
    s1.u(ed[i].first, ed[i].second);
  }
  int k;
  scanf("%d", &k);
  int r, l;
  while (k--) {
    scanf("%d%d", &r, &l);
    s = dp[r];
    for (int i = 1; i <= n; i++) s.u(i, dp1[l].find(i));
    printf("%d\n", s.c);
  }
  return 0;
}
