#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:60777216")
using namespace std;
const int maxN = 500;
const int maxM = 10000;
int n, m;
int b[maxM + 7];
int e[maxM + 7];
bool read() {
  if (scanf("%d%d", &n, &m) == EOF) {
    return false;
  }
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", b + i, e + i);
    --b[i], --e[i];
  }
  return true;
}
void make_set(int v, vector<int> &parent, vector<int> &rang) {
  rang[v] = 1;
  parent[v] = v;
}
int find_set(int v, vector<int> &parent) {
  if (v == parent[v]) {
    return v;
  }
  return parent[v] = find_set(parent[v], parent);
}
void union_set(int u, int v, vector<int> &parent, vector<int> &rang) {
  v = find_set(v, parent);
  u = find_set(u, parent);
  if (u != v) {
    if (rang[u] < rang[v]) {
      swap(u, v);
    }
    parent[v] = u;
    rang[u] += rang[v];
  }
}
void solve() {
  vector<vector<int> > prefixDsuRank(m, vector<int>(n));
  vector<vector<int> > suffixDsuRank(m, vector<int>(n));
  vector<vector<int> > prefixDsuParent(m, vector<int>(n));
  vector<vector<int> > suffixDsuParent(m, vector<int>(n));
  for (int i = 0; i < n; ++i) {
    make_set(i, prefixDsuParent[0], prefixDsuRank[0]);
    make_set(i, suffixDsuParent[m - 1], suffixDsuRank[m - 1]);
  }
  union_set(e[0], b[0], prefixDsuParent[0], prefixDsuRank[0]);
  for (int i = 1; i < m; ++i) {
    prefixDsuRank[i] = prefixDsuRank[i - 1];
    prefixDsuParent[i] = prefixDsuParent[i - 1];
    union_set(e[i], b[i], prefixDsuParent[i], prefixDsuRank[i]);
  }
  union_set(e[m - 1], b[m - 1], suffixDsuParent[m - 1], suffixDsuRank[m - 1]);
  for (int i = m - 2; i >= 0; --i) {
    suffixDsuRank[i] = suffixDsuRank[i + 1];
    suffixDsuParent[i] = suffixDsuParent[i + 1];
    union_set(e[i], b[i], suffixDsuParent[i], suffixDsuRank[i]);
  }
  int queries;
  scanf("%d", &queries);
  for (int i = 0; i < queries; ++i) {
    int l, r;
    scanf("%d%d", &l, &r);
    --l, --r;
    vector<int> currentDsuParent(n), currentDsuRank(n);
    for (int i = 0; i < n; ++i) {
      make_set(i, currentDsuParent, currentDsuRank);
    }
    int ans = n;
    if (l - 1 >= 0) {
      for (int i = 0; i < n; ++i) {
        int p_i = find_set(i, prefixDsuParent[l - 1]);
        if (find_set(p_i, currentDsuParent) != find_set(i, currentDsuParent)) {
          --ans;
          union_set(i, p_i, currentDsuParent, currentDsuRank);
        }
      }
    }
    if (r + 1 < m) {
      for (int i = 0; i < n; ++i) {
        int p_i = find_set(i, suffixDsuParent[r + 1]);
        if (find_set(p_i, currentDsuParent) != find_set(i, currentDsuParent)) {
          --ans;
          union_set(i, p_i, currentDsuParent, currentDsuRank);
        }
      }
    }
    printf("%d\n", ans);
  }
}
int main() {
  while (read()) solve();
  return 0;
}
