RT,不知道哪里写挂了呜呜
能过样例但就是过不了数据
#include<bits/stdc++.h>
using namespace std;
const int si_n=1e4+10;
const int si_m=5e4+10;
int n,m,q;
struct Kruskal{
int u,v,w;
bool operator < (const Kruskal &b)const{
return w>b.w;
}
}e[si_m];
int pa[si_n];
inline int root(int x){
if(pa[x]!=x) return pa[x]=root(pa[x]);
return pa[x];
}
inline bool Union(int x,int y){
int rx=root(x),ry=root(y);
if(rx==ry) return false;
pa[rx]=ry;
return true;
}
struct Tree{
int ver,head,Next,w;
}t[si_m];
int val[si_n];
int cnt=0,tot=n;
inline void add(int u,int v,int w){
t[++cnt].ver=v,t[cnt].Next=t[u].head;
t[u].head=cnt,t[cnt].w=w;
}
int dep[si_n],f[si_n][20];
bool vis[si_n];
void dfs(int i,int fa){
dep[i]=dep[fa]+1;
vis[i]=true,f[i][0]=fa;
for(register int j=1;j<18;++j){
f[i][j]=f[f[i][j-1]][j-1];
}
for(register int j=t[i].head;j;j=t[j].Next){
int v=t[j].ver;
if(v==fa) continue;
dfs(v,i);
}
}
int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(register int i=19;i>=0;--i){
if(dep[f[u][i]]>=dep[v]) u=f[u][i];
}
if(u==v) return u;
for(register int i=19;i>=0;--i){
if(f[u][i]!=f[v][i]){
u=f[u][i],v=f[v][i];
}
}
return f[u][0];
}
inline void insert(Kruskal p){
int ru=root(p.u),rv=root(p.v);
int k=++tot;val[k]=p.w;
pa[k]=pa[ru]=pa[rv]=k;
add(k,ru,1),add(ru,k,1);
add(k,rv,1),add(rv,k,1);
}
int main(){
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;++i){
pa[i]=i;
}
for(register int i=1;i<=m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[i]=(Kruskal){u,v,w};
}
sort(e+1,e+1+m);
for(register int i=1;i<=m;++i){
if(Union(e[i].u,e[i].v)) insert(e[i]);
}
for(register int i=1;i<=tot;++i){
if(!vis[i]) dfs(root(i),0);
}
scanf("%d",&q);
while(q--){
int l,r;
scanf("%d%d",&l,&r);
if(root(l)!=root(r)) puts("-1");
else printf("%d\n",val[lca(l,r)]);
}
return 0;
}