#include<bits/stdc++.h>
using namespace std;
const int N=300005;
int n,m,tot,max_len,hd[N],totQ,hdQ[N];
struct query{int u,v,lca,dist;bool operator<(const query&x)const{return dist>x.dist;}}q[N];
struct edge{int t,w,nxt;}es[N<<1],esQ[N<<1];
inline void add(register int u,register int v,register int w){es[++tot]=(edge){v,w,hd[u]};hd[u]=tot;}
inline void addQ(register int u,register int v,register int id){
esQ[++totQ]=(edge){v,id,hdQ[u]},hdQ[u]=totQ;
}
struct IO_Tp {
const static int _I_Buffer_Size = 2 << 20;
char _I_Buffer[_I_Buffer_Size], *_I_pos = _I_Buffer;
const static int _O_Buffer_Size = 2 << 20;
char _O_Buffer[_O_Buffer_Size], *_O_pos = _O_Buffer;
IO_Tp() { fread(_I_Buffer, 1, _I_Buffer_Size, stdin); }
~IO_Tp() { fwrite(_O_Buffer, 1, _O_pos - _O_Buffer, stdout); }
IO_Tp &operator>>(int &res) {
while (!isdigit(*_I_pos)) ++_I_pos;
res = *_I_pos++ - '0';
while (isdigit(*_I_pos)) res = res * 10 + (*_I_pos++ - '0');
return *this;
}
IO_Tp &operator<<(int n) {
static char _buf[10];
char *_pos = _buf;
do
*_pos++ = '0' + n % 10;
while (n /= 10);
while (_pos != _buf) *_O_pos++ = *--_pos;
return *this;
}
IO_Tp &operator<<(char ch) {
*_O_pos++ = ch;
return *this;
}
} IO;
int id[N],d[N],dist[N];
int s[N],cnt,ma;
bool vst[N];
int find(register int x){return x==id[x]?x:id[x]=find(id[x]);}
void unite(register int x,register int y){register int a=find(x),b=find(y);d[a]>d[b]?id[a]=b:id[b]=a;}
void tarjan(register int x){
id[x]=x;vst[x]=true;
for(register int i=hd[x],y;i;i=es[i].nxt)
if(!vst[y=es[i].t]){
d[y]=d[x]+1,dist[y]=dist[x]+es[i].w;
tarjan(y);
unite(y,x);
}
for(register int i=hdQ[x];i;i=esQ[i].nxt)
if(vst[esQ[i].t])
q[esQ[i].w].lca=find(esQ[i].t);
}
void dfs(register int u,register int fa){
for(register int i=hd[u],v;i;i=es[i].nxt)
if((v=es[i].t)!=fa)
dfs(v,u),s[u]+=s[v];
if(s[u]==cnt)ma=max(ma,dist[u]-dist[fa]);
}
inline bool ok(register int len){
memset(s,0,sizeof(s));
cnt=ma=0;
for(register int i=1;i<=m;i++)if(q[i].dist>len)cnt++,s[q[i].u]++,s[q[i].v]++,s[q[i].lca]-=2;
dfs(1,0);
if(max_len-ma>len)return 0;
else return 1;
}
int main(){
freopen("transport.in","r",stdin);
freopen("transport.out","w",stdout);
IO>>n>>m;
for(register int i=1,a,b,t;i<n;i++)IO>>a>>b>>t,add(a,b,t),add(b,a,t);
register int l=0,r=0,ans=0;
for(register int i=1;i<=m;i++){
IO>>q[i].u>>q[i].v;
addQ(q[i].u,q[i].v,i),addQ(q[i].v,q[i].u,i);
}
tarjan(1);
for(register int i=1;i<=m;i++)r=max(r,q[i].dist=dist[q[i].u]+dist[q[i].v]-dist[q[i].lca]*2);
ans=max_len=r;
sort(q+1,q+m+1);
while(l<=r){
register int mid=l+r>>1;
if(ok(mid))ans=mid,r=mid-1;
else l=mid+1;
}
IO<<ans;
return 0;
}
这玩意为啥选 C++ 的时候 CE 了啊
咋改啊/yun