rt找了好久找不出哪里出问题了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <numeric>
#include <algorithm>
#include <functional>
#include <map>
#include <queue>
#include <vector>
#include <utility>
#define ed end()
#define bg begin()
#define next first
#define wei second
#define mp make_pair
#define pb push_back
#define all(x) x.bg, x.ed
#define newline puts("")
#define si(x) ((int)x.size())
#define rep(i, n) for(register int i = 1; i <= n; ++i)
#define rrep(i, n) for(register int i = 0; i < n; ++i)
#define srep(i, s, t) for(register int i = s; i <= t; ++i)
#define drep(i, s, t) for(register int i = t; i >= s; --i)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAXN = 1e6 + 10;
const int MAXM = 3e6 + 10;
const int INF = 0x3f3f3f3f;
const ll INF_ll = 1ll * INF * INF;
const int MOD = 1e9 + 7;
const double eps = 1e-7;
int n, m, cnt;
struct edges{
int from, to, w;
} edge[MAXM];
vector<pii> vec[MAXN];
int fa[MAXN];
int f[MAXN][21], d[MAXN][21];
int dep[MAXN];
inline bool cmp(const edges&lhs, const edges&rhs){
return lhs.w < rhs.w;
}
inline int r(){
char c = getchar();int x = 0,fh = 0;
while(c < '0' || c > '9'){fh |= c == '-';c = getchar();}
while(c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}
return fh ? -x : x;
}
void print(int x){
if( x < 0 ) x = -x;
if( x >= 10 ) print(x/10);
putchar(x%10+'0');
}
inline int find(int x){
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void kruskal(){
rep(i, n) fa[i] = i;
sort(edge + 1, edge + 1 + m, cmp);
rep(i, m){
int x = edge[i].from, y = edge[i].to, w = edge[i].w;
int fx = find(x), fy = find(y);
if(fx == fy) continue;
vec[fx].pb(mp(fy, w)), vec[fy].pb(mp(fx, w));
fa[fx] = fy;
cnt++;
if(cnt == n - 1) break;
}
}
void dfs(int p, int ff, int len){
dep[p] = dep[ff] + 1;
f[p][0] = ff, d[p][0] = len;
for(register int i = 1; (1 << i) <= dep[p]; ++i){
f[p][i] = f[f[p][i - 1]][i - 1];
d[p][i] = max(d[p][i - 1], d[d[p][i - 1]][i - 1]);
}
int si = si(vec[p]);
rrep(i, si){
if(vec[p][i].next == ff) continue;
dfs(vec[p][i].next, p, vec[p][i].wei);
}
}
void swap(int&x, int&y){
x ^= y;
y ^= x;
x ^= y;
}
int lca(int x, int y){
int ret = -INF;
if(dep[x] > dep[y]) swap(x, y);
drep(i, 0, 20){
if(dep[x] + (1 << i) <= dep[y]) ret = max(ret, d[y][i]), y = f[y][i];
}
if(x == y) return ret;
drep(i, 0, 20){
if(f[x][i] == f[y][i]) continue;
ret = max(d[y][i], max(d[x][i], ret));
x = f[x][i];
y = f[y][i];
}
return max(max(ret, d[x][0]), d[y][0]);
}
int main(){
// ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
n = r(), m = r();
rep(i ,m) edge[i].from = r(), edge[i].to = r(), edge[i].w = r();
kruskal();
dfs(1, 0, 0);
int q = r();
rep(i, q){
int x = r(), y = r();
int fx = find(x), fy = find(y);
if(fx != fy) printf("impossible\n");
else printf("%d\n", lca(x, y));
}
return 0;
}