#include <bits/stdc++.h>
using namespace std ;
#define ll long long
#define sz(x) x.size()
// bitmasks
// Number of leading zeroes: __builtin_clz(x)
// Number of trailing zeroes : __builtin_ctz(x)
// Number of 1-bits: __builtin_popcount(x);
// last one : __lg()
template<typename T = ll, ll Base = 1>
struct DSU {
ll n;
vector<T> parent, Gsize, nxt, tail, pos, roots;
DSU(ll MaxNodes) {
n = MaxNodes + 1;
parent = Gsize = roots = tail = pos = nxt = vector<T>(MaxNodes + Base);
for (ll i = Base; i < MaxNodes + Base; i++) {
parent[i] = roots[i] = pos[i] = tail[i] = i;
nxt[i] = -1, Gsize[i] = 1;
}
}
T find_leader(ll node) {
return parent[node] = (parent[node] == node ? node : find_leader(parent[node]));
}
bool is_same_sets(ll u, ll v) {
return find_leader(u) == find_leader(v);
}
bool union_sets(ll u, ll v) {
ll leader_u = find_leader(u), leader_v = find_leader(v);
if (leader_u == leader_v) return 0;
// make leader_u is the leader with the larger component
if (Gsize[leader_u] < Gsize[leader_v])
swap(leader_u, leader_v);
ll p = pos[leader_v];
Gsize[leader_u] += Gsize[leader_v];
parent[leader_v] = leader_u;
roots[p] = roots.back();
pos[roots[p]] = p;
roots.pop_back();
nxt[tail[leader_u]] = leader_v;
tail[leader_u] = tail[leader_v];
return 1;
}
void print() {
for (ll root = Base; root < sz(roots); root++) {
for (ll u = roots[root]; ~u; u = nxt[u])
cout << u << " \n"[!~nxt[u]];
}
}
vector<vector<ll> > get_components() {
vector<vector<ll> > components;
for (ll root = Base; root < sz(roots); root++) {
vector<ll> component;
for (ll u = roots[root]; ~u; u = nxt[u])
component.push_back(u);
components.push_back(component);
}
return components;
}
ll get_size(ll u) {
return Gsize[find_leader(u)];
}
ll get_components_number() {
return sz(roots) - Base;
}
ll has_supervisor(ll b) {
return parent[b] != b;
}
void clear() {
parent = Gsize = roots = tail = pos = nxt = vector<T>(n + Base);
for (ll i = Base; i < n + Base; ++i) {
parent[i] = roots[i] = pos[i] = tail[i] = i;
nxt[i] = -1, Gsize[i] = 1;
}
}
};
struct edge {
ll n, u, v, w;
};
const ll MOD = 1e9;
#define u first
#define v second
void solve() {
ll n, m;
cin >> n >> m;
vector<pair<ll,ll> > edges(m + 1);
for (ll i = 1; i <= m; i++) {
auto &e = edges[i];
cin >> e.u >> e.v;
}
vector<vector<ll> > pref_leader(m + 1, vector<ll>(n + 1)), suff_leader(m + 1, vector<ll>(n + 1));
DSU<ll> dsu(n);
for (ll i = 1; i <= m; i++) {
dsu.union_sets(edges[i].u, edges[i].v);
for (ll j = 1; j <= n; j++) {
pref_leader[i][j] = dsu.find_leader(j);
}
}
DSU<ll> dsu2(n);
for (ll i = m; i >= 1; i--) {
dsu2.union_sets(edges[i].u, edges[i].v);
for (ll j = 1; j <= n; j++) {
suff_leader[i][j] = dsu2.find_leader(j);
}
}
ll q;
cin >> q;
while (q--) {
ll l, r;
cin >> l >> r;
DSU<ll> qd(n);
if (l - 1 >= 1)
qd.parent = pref_leader[l - 1];
for (ll i = 1; i <= n; i++) {
if (r + 1 > m)break;
qd.union_sets(i, suff_leader[r + 1][i]);
}
cout << qd.get_components_number() << endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// ll t;
// cin >> t;
// while (t--)
solve();
}
/*
If you have number of nodes connected with edges ( 1 ... m )
There is a queries asking if you removed edges from ( l .. r )
What is the number of connected components for each query ?
- Create pre computed pref_leader and suff_leader arraies
- on creating new edge get the parent of all the nodes after connecting this edge
for edge number x
for i = 1 -> n pref_leader[x][i] = dsu.find_leader(i);
- connect the graph in reverse edges , compute the suff_leader
- for L and R query connect the nodes to their parents at L-1 and R+1
- Count the components.
*/