#include <bits/stdc++.h>
int fa[505][10005];
int rfa[505][10005];
int tfa[505];
int trfa[505];
inline void init(int m) {
  for (int j = 1; j <= 500; ++j) fa[j][0] = j, rfa[j][m + 1] = j;
}
inline int find(int x, int id) {
  return fa[x][id] == x ? x : fa[x][id] = find(fa[x][id], id);
}
inline int rfind(int x, int id) {
  return rfa[x][id] == x ? x : rfa[x][id] = rfind(rfa[x][id], id);
}
inline int tfind(int x) { return tfa[x] == x ? x : tfa[x] = tfind(tfa[x]); }
inline int trfind(int x) {
  return trfa[x] == x ? x : trfa[x] = trfind(trfa[x]);
}
inline void join(int u, int v, int id) {
  int fau = find(u, id), fav = find(v, id);
  if (fau == fav) return;
  fa[fau][id] = fav;
}
inline void rjoin(int u, int v, int id) {
  int fau = rfind(u, id), fav = rfind(v, id);
  if (fau == fav) return;
  rfa[fau][id] = fav;
}
inline void tjoin(int u, int v) {
  int fau = tfind(u), fav = tfind(v);
  if (fau == fav) return;
  tfa[fau] = fav;
}
inline void trjoin(int u, int v) {
  int fau = trfind(u), fav = trfind(v);
  if (fau == fav) return;
  trfa[fau] = fav;
}
struct vex {
  int from, to;
  vex(int f, int t) : from(f), to(t) {}
};
int main() {
  int m, n;
  std::cin >> n >> m;
  std::vector<vex> vecx;
  init(m);
  for (int i = 1; i <= m; ++i) {
    int f, t;
    std::cin >> f >> t;
    vecx.push_back(vex(f, t));
    for (int j = 1; j <= n; ++j) {
      fa[j][i] = fa[j][i - 1];
    }
    join(f, t, i);
  }
  for (int i = m; i >= 1; --i) {
    for (int j = 1; j <= n; ++j) {
      rfa[j][i] = rfa[j][i + 1];
    }
    rjoin(vecx[i - 1].from, vecx[i - 1].to, i);
  }
  int q;
  std::cin >> q;
  int l, r;
  for (int i = 1; i <= q; ++i) {
    std::cin >> l >> r;
    for (int j = 1; j <= n; ++j) tfa[j] = fa[j][l - 1];
    for (int j = 1; j <= n; ++j) {
      if (rfa[j][r + 1] != tfa[j]) {
        tjoin(tfa[j], rfa[j][r + 1]);
      }
    }
    int cnt = 0;
    for (int j = 1; j <= n; ++j) {
      if (tfind(j) == j) cnt++;
    }
    std::cout << cnt << std::endl;
  }
}
