#include <bits/stdc++.h>   using namespace ::std;   const long double PI = acos(-1);   const long long MOD = 1000000000 + 7;   long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }   long long add(long long a, long long b, long long m = MOD) {     return (a % m + b % m + 2 * m) % m;   }   long long mul(long long a, long long b, long long m = MOD) {     return ((a % m + m) * (b % m + m)) % m;   }   long long pow_mod(long long a, long long b, long long m = MOD) {     long long res = 1LL;     a = a % m;     while (b) {       if (b & 1) res = mul(res, a, m);       b >>= 1;       a = mul(a, a, m);     }     return res;   }   long long fastexp(long long a, long long b) {     long long res = 1LL;     while (b) {       if (b & 1) res = res * a;       b >>= 1;       a *= a;     }     return res;   }   int gcdExtendido(int a, int b, int *x, int *y) {     if (a == 0) {       *x = 0;       *y = 1;       return b;     }     int x1, y1;     int gcd = gcdExtendido(b % a, a, &x1, &y1);     *x = y1 - (b / a) * x1;     *y = x1;     return gcd;   }   int modInverso(int a, int m) {     int x, y;     int g = gcdExtendido(a, m, &x, &y);     if (g != 1)       return -1;     else       return (x % m + m) % m;   }   const int M = 10000 + 5;   const int N = 500 + 5;   int n, m, k;   pair<int, int> edges[M];   int carry[N];   int s[N];   int sizes[3][M][N];   int parent[3][M][N];   int get(int x, int id, int type) {     return parent[type][id][x] == x                ? x                : parent[type][id][x] = get(parent[type][id][x], id, type);   }   void join(int a, int b, int id, int type) {     a = get(a, id, type);     b = get(b, id, type);     if (a == b) return;     if (sizes[type][id][a] > sizes[type][id][b]) swap(a, b);     parent[type][id][a] = b;     sizes[type][id][b] += sizes[type][id][a];   }   void initialize(int id, int type) {     for (int i = 1; i <= n; i++) {       parent[type][id][i] = i;       sizes[type][id][i] = 1;     }   }   int get2(int x) { return carry[x] == x ? x : carry[x] = get2(carry[x]); }   void join2(int a, int b) {     a = get2(a);     b = get2(b);     if (a == b) return;     if (s[a] > s[b]) swap(a, b);     carry[a] = b;     s[b] += s[a];   }   int main() {     scanf( %d %d , &(n), &(m));     initialize(0, 0);     for (int i = 1; i <= m; i++) {       for (int j = 1; j <= n; j++) {         parent[0][i][j] = parent[0][i - 1][j];         sizes[0][i][j] = sizes[0][i - 1][j];       }       scanf( %d %d , &(edges[i].first), &(edges[i].second));       join(edges[i].first, edges[i].second, i, 0);     }     initialize(m + 1, 1);     for (int i = m; i >= 1; i--) {       for (int j = 1; j <= n; j++) {         parent[1][i][j] = parent[1][i + 1][j];         sizes[1][i][j] = sizes[1][i + 1][j];       }       join(edges[i].first, edges[i].second, i, 1);     }     scanf( %d , &(k));     int l, r;     while (k--) {       scanf( %d %d , &(l), &(r));       l--;       r++;       for (int i = 1; i <= n; i++) {         carry[i] = parent[0][l][i];         s[i] = sizes[0][l][i];       }       queue<pair<int, int> > Q;       for (int i = 1; i <= n; i++) {         int x = get(i, r, 1);         join2(i, x);       }       int ans = 0;       for (int i = 1; i <= n; i++) {         if (get2(i) == i) ans++;       }       printf( %d n , ans);     }     return 0;   }