莫名奇妙TLE#4
#include<bits/stdc++.h>
using namespace std;
const int MAXX = 3e5 + 5;
const int MOD = 1e9 + 7;
int n, m, vis[MAXX], dcc[MAXX], dfn[MAXX], low[MAXX], cnt, num, u[MAXX], v[MAXX], flag[MAXX], sum, ans, q, x, y, deep[MAXX], dis[MAXX], f[MAXX][20];
vector<pair<int, int> > e[MAXX];
vector<int> G[MAXX];
void tarjan(int x, int fa){
dfn[x] = low[x] = ++cnt;
for(int i = 0; i < e[x].size(); i++){
int y = e[x][i].first;
int id = e[x][i].second;
if(!dfn[y]){
tarjan(y, x);
low[x] = min(low[x], low[y]);
if(dfn[x] < low[y]){
vis[id] = 1;
}
}else if(y != fa){
low[x] = min(low[x], dfn[y]);
}
}
}
void dfs(int x){
sum++;
dcc[x] = num;
for(int i = 0; i < e[x].size(); i++){
int y = e[x][i].first;
int id = e[x][i].second;
if(!dcc[y] && !vis[id]){
dfs(y);
}
}
}
int Dfs(int x, int fa){
for(int i = 1; i <= 16; i++){
if(deep[x] < (1 << i)) break;
f[x][i] = f[f[x][i - 1]][i - 1];
}
for(int i = 0; i < G[x].size(); i++){
int y = G[x][i];
if(y == fa) continue;
deep[y] = deep[x] + 1;
dis[y] = dis[x] + (flag[x] == 2);
f[y][0] = x;
Dfs(y, x);
}
}
int lca(int x, int y){
if(deep[x] < deep[y]){
swap(x, y);
}
int d = deep[x] - deep[y];
for(int i = 0; i <= 16; i++){
if((1 << i) & d)
x = f[x][i];
}
if(x == y){
return x;
}
for(int i = 16; i >= 0; i++){
if(f[x][i] != f[y][i]){
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
int pow(int b,int p){
int ret = 1;
while(p){
if(p % 2) ret = ret * b % MOD;
b = b * b % MOD;
p /= 2;
}
return ret;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i++){
cin >> u[i] >> v[i];
e[u[i]].push_back({v[i], i});
e[v[i]].push_back({u[i], i});
}
for(int i = 1; i <= n; i++){
if(!dfn[i]){
tarjan(i, -1);
}
}
for(int i = 1; i <= n; i++){
if(!dcc[i]){
num++;
sum = 0;
dfs(i);
if(sum == 1){
flag[num] = 1;
}else{
flag[num] = 2;
}
}
}
for(int i = 1; i <= m; i++){
if(dcc[u[i]] != dcc[v[i]]){
G[dcc[u[i]]].push_back(dcc[v[i]]);
G[dcc[v[i]]].push_back(dcc[u[i]]);
}
}
dis[1] = (flag[1] == 2);
Dfs(1, -1);
cin >> q;
while(q--){
cin >> x >> y;
x = dcc[x], y = dcc[y];
if(x == y){
cout << flag[x] << '\n';
continue;
}
int fa = lca(x, y);
cout << pow(2, dis[x] + dis[y] - 2 * dis[fa]) << '\n';
}
return 0;
}