#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007ll;
template <typename F, typename S>
ostream &operator<<(ostream &os, const pair<F, S> &p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "{";
  typename vector<T>::const_iterator it;
  for (it = v.begin(); it != v.end(); it++) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &v) {
  os << "[";
  typename set<T>::const_iterator it;
  for (it = v.begin(); it != v.end(); it++) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "]";
}
template <typename F, typename S>
ostream &operator<<(ostream &os, const map<F, S> &v) {
  os << "[";
  typename map<F, S>::const_iterator it;
  for (it = v.begin(); it != v.end(); it++) {
    if (it != v.begin()) os << ", ";
    os << it->first << " = " << it->second;
  }
  return os << "]";
}
inline int mul(int a, int b) { return (a * 1ll * b) % MOD; }
inline int add(int a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
  return a;
}
inline int power(int a, int b) {
  int rt = 1;
  while (b > 0) {
    if (b & 1) rt = mul(rt, a);
    a = mul(a, a);
    b >>= 1;
  }
  return rt;
}
inline int inv(int a) { return power(a, MOD - 2); }
int n;
typedef struct data {
  int connected;
  int root[509], sz[509];
  void init() {
    for (int i = 1; i <= n; i++) {
      root[i] = i;
      sz[i] = 1;
    }
    connected = n;
  }
  int rt(int k) {
    while (k != root[k]) {
      root[k] = root[root[k]];
      k = root[k];
    }
    return k;
  }
  void merge(int u, int v) {
    int rt1 = rt(u), rt2 = rt(v);
    if (rt1 == rt2) return;
    connected--;
    if (sz[rt2] >= sz[rt1]) swap(rt2, rt1);
    sz[rt1] += sz[rt2];
    sz[rt2] = 0;
    root[rt2] = root[rt1];
  }
} DSU;
const int M = 20050;
DSU pref[M], suff[M];
int u[M], m, v[M];
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    cin >> u[i] >> v[i];
  }
  pref[0].init();
  for (int i = 1; i <= m; i++) {
    pref[i] = pref[i - 1];
    pref[i].merge(u[i], v[i]);
  }
  suff[m + 1].init();
  for (int i = m; i >= 1; i--) {
    suff[i] = suff[i + 1];
    suff[i].merge(u[i], v[i]);
  }
  int q;
  cin >> q;
  while (q--) {
    int l, r;
    cin >> l >> r;
    l--;
    r++;
    DSU cur = suff[r];
    for (int i = 1; i <= n; i++) {
      cur.merge(i, pref[l].rt(i));
    }
    cout << cur.connected << "\n";
  }
  return 0;
}
