:::warning[错误代码]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define REV(i,a,b) for(int i=(a);i>=(b);i--)
#define CLOSE_TIE ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define psbk push_back
#define mkp make_pair
#define endl '\n'
#define outval(x) cout<<(#x)<<'='<<x<<endl;
#define outarr(a,be,ed)\
cout<<(#a)<<'=';\
FOR(i,be,ed)cout<<a[i]<<' ';\
cout<<endl;
const int N=1e4+5;
struct Edge{int v,id;};
int n,m,q,dfn[N],low[N],bel[N],cnt,tot,fa[N][20],dep[N];
stack<int> stk;
vector<Edge> e[N];
vector<int> g[N];
void dfs(int u,int lst){
dfn[u]=low[u]=++cnt;
stk.push(u);
for(Edge i:e[u]){
int v=i.v,id=i.id;
if(id==(lst^1)) continue;
if(!dfn[v]){
dfs(v,id);
low[u]=min(low[u],low[v]);
}else low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
++tot;
while(stk.top()!=u){
bel[stk.top()]=tot; stk.pop();
}
bel[stk.top()]=tot; stk.pop();
}
}
void dfs1(int u,int f){
fa[u][0]=f; dep[u]=dep[f]+1;
FOR(i,1,20) fa[u][i]=fa[fa[u][i-1]][i-1];
for(int v:g[u])
if(v!=f) dfs1(v,u);
}
int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
int dis=dep[u]-dep[v];
FOR(i,0,20)
if(dis&(1<<i)) u=fa[u][i];
if(u==v) return u;
REV(i,20,0)
if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[v][0];
}
signed main(){
CLOSE_TIE
cin>>n>>m;
map<pair<int,int>,bool> mp;
FOR(i,1,m){
int x,y;
cin>>x>>y;
if(x>y) swap(x,y);
if(mp[mkp(x,y)]) continue;
mp[mkp(x,y)]=1;
e[x].psbk({y,i<<1});
e[y].psbk({x,i<<1|1});
}
FOR(i,1,n)
if(!dfn[i]) dfs(i,0);
mp.clear();
FOR(u,1,n)
for(Edge i:e[u]){
int v=i.v;
int bu=bel[u],bv=bel[v];
if(bu>bv) swap(bu,bv);
if(bu!=bv&&!mp[mkp(bu,bv)]){
g[bu].psbk(bv); g[bv].psbk(bu);
mp[mkp(bu,bv)]=1;
}
}
FOR(i,1,tot)
if(!dep[i]) dfs1(i,0);
//outarr(dep,1,n); outarr(bel,1,n);
cin>>q;
FOR(i,1,q){
int x,y;
cin>>x>>y;
int bx=bel[x],by=bel[y];
int ans=dep[bx]+dep[by]-2*dep[lca(bx,by)]+1;
string s;
while(ans){
s+='0'+ans%2;
ans>>=1;
}
reverse(s.begin(),s.end());
cout<<s<<endl;
}
return 0;
}
:::