RT。看了讨论区判了重边,还是只有 63pts。
实在找不出错QwQ
#include<bits/stdc++.h>
//#define int ll
#define pb push_back
#define mp make_pair
#define sec second
#define fir first
#define pii pair<int,int>
#define piii pair<int,pair<int,int> >
using namespace std;
typedef long long ll;
const int N=500005;
const int inf=(1<<30)-1;
const ll inff=1ll<<60;
const int mod=1e9+7;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n,m,q;
int tot[2],head[N][2];
struct Edge{
int from,to,nxt;
}e[N<<1][2];
int dfn[N],low[N],ind;
int bri[N<<1];
int from[N];
int cnt,lg[N],dep[N],fa[N][25];
void out(int x){
for(int i=lg[x];i>=0;i--)
putchar('0'+((x&(1<<i))?1:0));
putchar('\n');
}
void add(int u,int v,int p){
e[++tot[p]][p].from=u;
e[tot[p]][p].to=v;
e[tot[p]][p].nxt=head[u][p];
head[u][p]=tot[p];
}
void tarjan(int u,int fa){
dfn[u]=low[u]=(++ind);
for(int i=head[u][0];i;i=e[i][0].nxt){
int v=e[i][0].to;
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])
bri[i]=bri[i^1]=1;
}
else if(v!=fa) low[u]=min(low[u],dfn[v]);
}
}
void dfs1(int u){
from[u]=cnt;
for(int i=head[u][0];i;i=e[i][0].nxt){
int v=e[i][0].to;
if(bri[i] || from[v]) continue;
dfs1(v);
}
}
void dfs2(int u,int father){
for(int i=head[u][1];i;i=e[i][1].nxt){
int v=e[i][1].to;
if(v==father) continue;
dep[v]=dep[u]+1;
fa[v][0]=u;
dfs2(v,u);
}
}
int anc(int x,int t){
for(int i=lg[t];i>=0;i--)
if(t & (1<<i)) x=fa[x][i];
return x;
}
int lca(int u,int v){
if(dep[u] > dep[v]) u^=v^=u^=v;
v=anc(v,dep[v]-dep[u]);
if(u==v) return u;
for(int i=lg[dep[u]];i>=0;i--)
if(fa[u][i] != fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
set<pii>mul;
int main(){int tests=1;//tests=read();
while(tests--){
n=read(),m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
if(u!=v && !mul.count(mp(u,v)))
add(u,v,0),add(v,u,0),
mul.insert(mp(u,v)),mul.insert(mp(v,u));
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i,-1);
for(int i=1;i<=n;i++)
if(!from[i]) cnt++,dfs1(i);
for(int u=1;u<=n;u++)
for(int i=head[u][0];i;i=e[i][0].nxt){
int v=e[i][0].to;
// printf("u:%d from[u]:%d v:%d from[v]:%d\n",u,from[u],v,from[v]);
if(from[u] != from[v])
add(from[u],from[v],1);
}
dfs2(1,-1);
for(int i=2;i<=cnt;i++) lg[i]=lg[i>>1]+1;
for(int j=1;j<=lg[cnt];j++)
for(int i=1;i<=cnt;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
q=read();
while(q--){
int u=from[read()],v=from[read()];
int lc=lca(u,v);
// printf("u:%d v:%d lca:%d\n",u,v,lc);
// printf("dep[u]:%d dep[v]:%d dep[lca]:%d\n",dep[u],dep[v],dep[lc]);
// printf("ans:%d\n",dep[u]-dep[lc]+1+dep[v]-dep[lc]);
out(dep[u]-dep[lc]+1+dep[v]-dep[lc]);
}
} return 0;
}