调不出来哪里有问题……不知道是写法除了错还是
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <stack>
#include <algorithm>
using namespace std;
#define ll long long
#define ri register int
char buf[1 << 20], *p1, *p2;
//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)?EOF: *p1++)
template <typename T> inline void read(T &t) {
ri v = getchar();T f = 1;t = 0;
while (!isdigit(v)) {if (v == '-')f = -1;v = getchar();}
while (isdigit(v)) {t = t * 10 + v - 48;v = getchar();}
t *= f;
}
template <typename T,typename... Args> inline void read(T &t,Args&... args) {
read(t);read(args...);
}
const int N = 10010;
const int M = 100010;
struct graph {
int hd[N],to[M],nxt[M],tot = 1;
inline void add(int u,int v) {to[++tot] = v;nxt[tot] = hd[u];hd[u ] = tot;}
inline void addedge(int u,int v) {add(u,v);add(v,u);}
}g1,g2;
int n,m,dfn[N],low[N],cnt,num;
bool bridge[M];
void tarjan(int x,int ine) {
dfn[x] = low[x] = ++cnt;
for (int i = g1.hd[x];i;i = g1.nxt[i]) {
int y = g1.to[i];
if (!dfn[y]) {
tarjan(y,i);
low[x] = min(low[x],low[y]);
if (low[y] > dfn[x]) {
bridge[i] = bridge[i^1] = 1;
}
} else if (i != (ine ^ 1)){
low[x] = min(low[x],dfn[y]);
}
}
}
int c[N];
void dfs0(int x) {
c[x] = num;
for (int i = g1.hd[x];i;i = g1.nxt[i]) {
int y = g1.to[i];
if (!c[y] && !bridge[i]) {
dfs0(y);
}
}
}
int top[N],son[N],dep[N],siz[N],fat[N];
void dfs1(int x,int f) {
dep[x] = dep[f] + 1;
siz[x] = 1;
son[x] = 0;
fat[x] = f;
for (int i = g2.hd[x];i;i = g2.nxt[i]) {
int v = g2.to[i];
if (v != f) {
dfs1(v,x);
siz[x] += siz[v];
if (siz[v] > siz[son[x]]) {
son[x] = v;
}
}
}
}
void dfs2(int x,int f) {
if (son[f] == x) top[x] = top[f];
else top[x] = x;
if (son[x]) dfs2(son[x],x);
for (int i = g2.hd[x];i;i = g2.nxt[i]) {
int v = g2.to[i];
if (v != f && v != son[x]) {
dfs2(v,x);
}
}
}
int LCA(int x,int y) {
for (int tx = top[x],ty = top[y];tx != ty;) {
if (dep[tx] > dep[ty]) {
tx = top[x = fat[tx]];
} else {
ty = top[y = fat[ty]];
}
}
return dep[x] < dep[y] ? x : y;
}
stack <int> s;
void output(int x) {
while (!s.empty()) s.pop();
while (x) {s.push(x % 2);x >>= 1;}
while (!s.empty()) {printf("%d",s.top());s.pop();}
puts("");
}
int main() {
read(n,m);
for (int i = 1;i <= m;++i) {int u,v;read(u,v);g1.addedge(u,v);}
for (int i = 1;i <= n;++i) {if (!dfn[i]) tarjan(i,0);}
for (int i = 1;i <= n;++i) {if (!c[i]) {++num,dfs0(i);}}
for (int i = 2;i <= g1.tot;i++) {
int x = g1.to[i^1],y = g1.to[i];
if (c[x] == c[y]) continue;
g2.add(x,y);
}
dfs1(1,0);dfs2(1,0);
int k;read(k);
for (int i = 1;i <= k;++i) {
int x,y;read(x,y);x = c[x],y = c[y];
output(dep[x] + dep[y] - 2 * dep[LCA(x,y)] + 1);
}
}