/*给定一个无向图,往里面加边,问加第i条边时图中的桥数首先肯定要求初始状态下的桥,染色缩点每次给定的边为(u,v), 那么u->lca(u,v)->v路上的所有边都不再是桥 求LCA时可以直接暴力,一个一个点往上找即可,网上好多题解都是用并查集做的。。*/#includeusing namespace std;#define maxn 200005struct Edge{ int to,nxt,cut;}edge[maxn<<1],edge_c[maxn<<1];int head[maxn],tot,head_c[maxn],tot_c,n,m,q;void addedge(int u,int v){ edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++; edge[tot].cut=0;}void add_c(int u,int v){ edge_c[tot_c].to=v; edge_c[tot_c].nxt=head_c[u]; head_c[u]=tot_c++;}int dfn[maxn],low[maxn],ind,c[maxn],dcc;void tarjan(int u,int in_edge){ dfn[u]=low[u]=++ind; for(int i=head[u];i!=-1;i=edge[i].nxt){ int v=edge[i].to; if(!dfn[v]){ tarjan(v,i); low[u]=min(low[u],low[v]); if(dfn[u] dep[v]){ if(flag[u]) res++,flag[u]=0; u=fa[u]; } while(u!=v){ if(flag[u]) res++,flag[u]=0; if(flag[v]) res++,flag[v]=0; u=fa[u]; v=fa[v]; } return res;}void init(){ memset(head,-1,sizeof head); memset(head_c,-1,sizeof head_c); memset(dep,0,sizeof dep); memset(fa,0,sizeof fa); memset(flag,0,sizeof flag); memset(c,0,sizeof c); memset(dfn,0,sizeof dfn); memset(low,0,sizeof low); tot=tot_c=ind=dcc=0;}int main(){ int tt=0; while(cin>>n>>m,n){ init(); for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; addedge(u,v); addedge(v,u); } tarjan(1,0); dcc=0;//染色 for(int i=1;i<=n;i++) if(!c[i]){ ++dcc; dfs1(i); } int ans=0; for(int i=0;i >q; for(int i=1;i<=q;i++){ int u,v; cin>>u>>v; ans-=lca(c[u],c[v]); printf("%d\n",ans); } /* for(int i=1;i<=n;i++) cout< <<" "< <<" "< <<" "< <