#include <bits/stdc++.h>
using namespace std;
const int N = 555;
struct DSU {
  int par[N], rank[N];
  int com;
  void init(int n) {
    com = n;
    for (int i = 0; i < n; i++) {
      par[i] = i;
      rank[i] = 1;
    }
  }
  inline int find(int i) { return par[i] == i ? i : par[i] = find(par[i]); }
  void un(int a, int b) {
    int x, y;
    x = find(a);
    y = find(b);
    if (x == y) return;
    com--;
    if (rank[x] > rank[y]) {
      int t;
      t = x;
      x = y;
      y = t;
    }
    if (rank[x] == rank[y]) rank[x]++;
    par[x] = y;
    return;
  }
};
DSU ldsu[10004], rdsu[10004];
pair<int, int> edge[10004];
int n, m;
int getans(int l, int r) {
  DSU t = ldsu[l];
  for (int i = r; i < m; i++) t.un(edge[i].first, edge[i].second);
  return t.com;
}
void init() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    edge[i] = make_pair(x - 1, y - 1);
  }
  ldsu[0].init(n);
  ldsu[0].un(edge[0].first, edge[0].second);
  for (int i = 1; i < m; i++) {
    int x, y;
    x = edge[i].first;
    y = edge[i].second;
    ldsu[i] = ldsu[i - 1];
    ldsu[i].un(x, y);
  }
  rdsu[m - 1].init(n);
  rdsu[m - 1].un(edge[m - 1].first, edge[m - 1].second);
  for (int i = m - 2; i >= 0; i--) {
    int x, y;
    x = edge[i].first;
    y = edge[i].second;
    rdsu[i] = rdsu[i + 1];
    rdsu[i].un(x, y);
  }
}
void slove() {
  int k;
  scanf("%d", &k);
  while (k--) {
    int l, r;
    scanf("%d%d", &l, &r);
    l--;
    r--;
    if (!l && r == m - 1)
      printf("%d\n", n);
    else if (!l)
      printf("%d\n", rdsu[r + 1].com);
    else if (r == m - 1)
      printf("%d\n", ldsu[l - 1].com);
    else
      printf("%d\n", getans(l - 1, r + 1));
  }
  return;
}
int main() {
  init();
  slove();
  return 0;
}
