rt,死活调不出来
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n, m;
int tot;
vector<int> e[N], G[N];
int low[N], dfn[N], tim;
int dep[N], fa[N][20];
int x[N], y[N];
stack<int> stk;
void tarjan(int u) {
dfn[u] = low[u] = ++ tim;
stk.push(u);
for (auto v : e[u]) {
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
if (low[v] >= dfn[u]) {
tot ++;
int x;
do {
x = stk.top(), stk.pop();
G[x].push_back(tot);
G[tot].push_back(x);
} while (x != v);
G[u].push_back(tot);
G[tot].push_back(u);
}
} else {
low[u] = min(low[u], dfn[v]);
}
}
}
void dfs(int u, int fath) {
dep[u] = dep[fath] + 1, fa[u][0] = fath;
for (int i = 1; i <= __lg(dep[u]); i ++) {
fa[u][i] = fa[fa[u][i - 1]][i - 1];
}
for (auto v : G[u]) {
if (v == fath) continue;
dfs(v, u);
}
}
int lca(int u, int v) {
if (dep[u] < dep[v]) {
swap(u, v);
}
while (dep[u] != dep[v]) {
u = fa[u][__lg(dep[u] - dep[v])];
}
if (u == v) return u;
for (int k = __lg(dep[u]); k >= 0; k --) {
if (fa[u][k] != fa[v][k]) {
u = fa[u][k];
v = fa[v][k];
}
}
return fa[u][0];
}
int dist(int u, int v) {
return (dep[u] + dep[v] - 2 * dep[lca(u, v)]) / 2 - 1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
while (cin >> n >> m, n && m) {
for (int i = 1; i <= n * 2; i ++) {
low[i] = dfn[i] = dep[i] = 0;
e[i].clear(), G[i].clear();
for (int j = 0; j <= 20; j ++) {
fa[i][j] = 0;
}
}
for (int i = 1; i <= m; i ++) {
cin >> x[i] >> y[i];
e[x[i]].push_back(y[i]);
e[y[i]].push_back(x[i]);
}
tot = n;
for (int i = 1; i <= n; i ++) {
if (!dfn[i]) {
tarjan(i);
dfs(i, 0);
}
}
int q;
cin >> q;
while (q --) {
int a, b;
cin >> a >> b;
cout << max({dist(x[a], y[a]), dist(x[a], y[b]), dist(x[b], y[a]), dist(x[b], y[b])}) << "\n";
}
}
return 0;
}