本地 RE,提交 AC
#include<bits/stdc++.h>
using namespace std;
static inline int read(){
int x=0;bool f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=0;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^48);s=getchar();}
return f?x:-x;
}
const int M=1e4+10;
const int N=5e4+10;
vector<int>e[M];
vector<int>g[M];
int n,m,tot,dfn[M],low[M],vis[M],jl[M],num,kkk;
int x[N],y[N],f[M][25],dep[M];
stack<int>s;
void tarjan(int u,int fa){
dfn[u]=low[u]=++num;
s.push(u);
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(v==fa)continue;
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else if(!jl[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
++kkk;
while(s.top()!=u){
jl[s.top()]=kkk;
s.pop();
}
jl[s.top()]=kkk;
s.pop();
}
}
void dfs(int u,int fa){
if(vis[u])return ;
vis[u]=1;
dep[u]=dep[fa]+1;
for(int i=1;i<=20;i++) f[u][i]=f[f[u][i-1]][i-1];
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(v==fa) continue;
f[v][0]=u;
dfs(v,u);
}
}
static inline int lca(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
for(int i=20;i>=0;i--)
if(dep[f[a][i]]>=dep[b])
a=f[a][i];
if(a==b) return a;
for(int i=20;i>=0;i--)
if(f[a][i]!=f[b][i])
a=f[a][i],b=f[b][i];
return f[a][0];
}
void print(int x){
if(!x)return ;
print(x>>1);
printf("%d",x&1);
}
signed main(void){
n=read(),m=read();
for(int i=1;i<=m;i++){
x[i]=read(),y[i]=read();
e[x[i]].push_back(y[i]);
e[y[i]].push_back(x[i]);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,i);
for(int i=1;i<=m;i++)
if(jl[x[i]]^jl[y[i]])
g[jl[x[i]]].push_back(jl[y[i]]),g[jl[y[i]]].push_back(jl[x[i]]);
kkk++;
for(int i=1;i^kkk;i++) if(!vis[i]) dfs(i,i);
tot=read();
for(int i=1;i<=tot;i++){
int x,y;
x=read(),y=read();
int l=lca(jl[x],jl[y]);
print(dep[jl[x]]-dep[l]+dep[jl[y]]-dep[l]+1);
puts(" ");
}
return 0;
}