rt,被Hack了,但只被Hack了,没次数了,不知道错哪了,记录
#include<bits/stdc++.h>
#define ll long long
#define bug cout<<"BUG\n"
#define V vector
using namespace std;
const int N=2e5+10;
struct SegTree{
struct node{
int l,r,minn;
};
V<node>a;
SegTree(int _n):a(_n*4+2){}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
void push_up(int x){
a[x].minn=min(a[ls(x)].minn,a[rs(x)].minn);
}
void build(int x,int l,int r,V<int>&b){
a[x].l=l;a[x].r=r;
if(l==r){
a[x].minn=b[l];
return;
}
int mid=l+r>>1;
build(ls(x),l,mid,b);build(rs(x),mid+1,r,b);
push_up(x);
}
int query(int x,int L,int R){
if(a[x].l>=L&&a[x].r<=R) return a[x].minn;
int res=1e9+10,mid=(a[x].l+a[x].r)>>1;
if(L<=mid) res=min(res,query(ls(x),L,R));
if(R>mid) res=min(res,query(rs(x),L,R));
return res;
}
};
using P=array<int,2>;
using T=array<int,3>;
using F=array<int,4>;
V<V<P> >e;
V<T>edge;
V<int>id,val,former,siz,son,fa,dep,top;
void dfs1(int u,int fat){
fa[u]=fat;
dep[u]=dep[fat]+1;
siz[u]=1;
for(auto i:e[u]){
int v=i[0],w=i[1];
if(v==fat)continue;
former[v]=w;
dfs1(v,u);
siz[u]+=siz[v];
if(!son[u]||siz[son[u]]<siz[v]) son[u]=v;
}
}
int cnt=0;
void dfs2(int u,int tp){
top[u]=tp;
id[u]=++cnt;
val[cnt]=former[u];
if(!son[u]) return;
dfs2(son[u],tp);
for(auto i:e[u]){
int v=i[0];
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int query(SegTree &lls,int u,int v){
int ans=1e9+10;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans=min(ans,lls.query(1,id[top[u]],id[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
if(u!=v) ans=min(ans,lls.query(1,id[son[u]],id[v]));
return ans;
}
V<int>fat;
int fin(int x){
if(fat[x]!=x)fat[x]=fin(fat[x]);
return fat[x];
}
void kl(int n,int m){
for(int i=1;i<=n;i++)fat[i]=i;
sort(edge.begin()+1,edge.end(),greater<T>());
int tot=0;
for(int i=1;i<=m;i++){
int u=edge[i][1],v=edge[i][2],w=edge[i][0];
if(fin(u)!=fin(v)){
e[u].push_back({v,w});
e[v].push_back({u,w});
tot++;
fat[fin(u)]=fin(v);
}
if(tot==n-1)break;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m;cin>>n>>m;
e.resize(n+1);edge.resize(m+1);val.resize(n+1);
fa.resize(n+1);fat.resize(n+1);former.resize(n+1);
id.resize(n+1);dep.resize(n+1);top.resize(n+1);
siz.resize(n+1);son.resize(n+1);
for(int i=1;i<=m;i++){
cin>>edge[i][1]>>edge[i][2]>>edge[i][0];
}
kl(n,m);
dfs1(1,0);dfs2(1,1);
SegTree lls(n+1);lls.build(1,1,n,val);
int q;cin>>q;
while(q--){
int u,v;cin>>u>>v;
if(fin(u)!=fin(v)) cout<<-1<<"\n";
else cout<<query(lls,u,v)<<"\n";
}
return 0;
}
/*
5 4
1 2 1
1 3 1
2 3 1
4 5 5
1
4 5
*/
万能的谷民啊,帮帮孩子吧