#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
const int maxm = 1e4 + 5;
struct node {
  int pre[maxn];
  void init() {
    for (int i = 0; i < maxn; ++i) {
      pre[i] = i;
    }
  }
  int Find(int x) {
    if (x != pre[x]) pre[x] = Find(pre[x]);
    return pre[x];
  }
  void v(int x, int y) {
    int fx = Find(x), fy = Find(y);
    if (fx != fy) pre[fy] = fx;
  }
};
struct node q[maxm], h[maxm];
int u[maxm], v[maxm];
int n, m;
int solve(node a, node b) {
  int ans = 0;
  for (int i = 1; i <= n; ++i) {
    a.v(i, b.Find(i));
  }
  for (int i = 1; i <= n; ++i) {
    if (a.Find(i) == i) ans++;
  }
  return ans;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) scanf("%d%d", &u[i], &v[i]);
  q[0].init();
  h[m + 1].init();
  for (int i = 1; i <= m; ++i) {
    q[i] = q[i - 1];
    q[i].v(u[i], v[i]);
  }
  for (int i = m; i >= 1; --i) {
    h[i] = h[i + 1];
    h[i].v(u[i], v[i]);
  }
  int tt;
  scanf("%d", &tt);
  while (tt--) {
    int x, y;
    scanf("%d%d", &x, &y);
    printf("%d\n", solve(q[x - 1], h[y + 1]));
  }
  return 0;
}
