#include using namespace std; using ll=long long; using ld=double; #define FOR(i,a,b) for(ll i=a;i<(ll)b;++i) #define F(n) FOR(i,0,n) #define FF(n) FOR(j,0,n) #define aa first #define bb second #define PB push_back #define EQ(a,b) (fabs(a-b)<=(fabs(a+b)*EPS)) #define MOD ((ll)(1e9+7)) struct UnionFind { vector parent; vector depth; UnionFind(int n): parent(vector(n)), depth(vector(n, 0)) { for (int i = 0; i < n; ++ i) parent[i] = i; } // nalezne koren pro vrchol v // O(log*(n)) int find(int v) { return (v == parent[v]) ? v : parent[v] = find(parent[v]); } // zjisti, jestli jsou dva vektory ve stejne komponente bool check(int a, int b) { return find(a) == find(b); } // spoji dva vrcholy do jedne komponenty void do_union(int a, int b) { if (a == b) return; int ar = find(a), br = find(b); if (depth[ar] < depth[br]) { parent[ar] = br; } else if (depth[ar] > depth[br]) { parent[br] = ar; } else { parent[br] = ar; depth[ar] ++; } } }; vector> e; vector> qr; int main(){ ios::sync_with_stdio(0);cin.tie(0); ll n, m; cin >> n >> m; e = vector>(m); F(m) { cin >> e[i].aa >> e[i].bb; e[i].aa --; e[i].bb --; } ll q; cin >> q; qr = vector>(q); F(q) { cin >> qr[i].aa >> qr[i].bb; qr[i].aa --; qr[i].bb --; ll ans = 0; for (int st = qr[i].aa; st <= qr[i].bb; ++ st) { UnionFind uf(n); for (int en = st; en <= qr[i].bb; ++ en) { if (uf.check(e[en].aa, e[en].bb)) break; uf.do_union(e[en].aa, e[en].bb); ans ++; } } cout << ans << '\n'; } return 0; }