常数是检验人傻的唯一标准……
但是今天我要推翻这句话。
我这么机智,怎么还有巨大常数……
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Max(x,y) x>y?x:y;
#define maxn 300005
using namespace std;
void read(int &a)
{
a=0;char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
a*=10;a+=c-'0';
c=getchar();
}
}
struct bi{
int to,nxt,d;
}b[600005];
int fst[maxn],tot;
void build(int f,int t,int d)
{
b[++tot]=(bi){t,fst[f],d};fst[f]=tot;
b[++tot]=(bi){f,fst[t],d};fst[t]=tot;
}
int dis[maxn],deep[maxn];
int fa[21][maxn];
int dfs_n[maxn],dfs_c;
int D[maxn];
void dfs(int x)
{
dfs_n[++dfs_c]=x;
int v,i;
for(i=1;i<=19;i++)
fa[i][x]=fa[i-1][fa[i-1][x]];
for(i=fst[x];i;i=b[i].nxt)
{
v=b[i].to;
if(!fa[0][v])
{
fa[0][v]=x;
deep[v]=deep[x]+1;
dis[v]=dis[x]+b[i].d;
D[v]=b[i].d;
dfs(v);
}
}
}
int LCA;
void lca(int u,int v)
{
if(deep[u]>deep[v]) swap(u,v);
int t=deep[v]-deep[u];
int i;
for(i=0;i<=19;i++)
if(t>>i&1)v=fa[i][v];
for(i=19;i>=0;i--)
if(fa[i][v]!=fa[i][u])
{
u=fa[i][u];
v=fa[i][v];
}
if(u==v) LCA=u;
else LCA=fa[0][u];
}
struct dd{int u,v,d,ca;}d[maxn];
bool cmp(dd a,dd b){return a.d>b.d;}
int add[maxn];
int S[maxn],top;
int main()
{
int n,m;
read(n);read(m);
int u,v,w;
for(int i=1;i<n;i++)
{
read(u);read(v);read(w);
build(u,v,w);
}
fa[0][1]=1;dfs(1);
for(int i=1;i<=m;i++)
{
read(d[i].u);read(d[i].v);
lca(d[i].u,d[i].v);
d[i].ca=LCA;
d[i].d=dis[d[i].u]+dis[d[i].v]-2*dis[d[i].ca];
}
sort(d+1,d+m+1,cmp);
int l=-1,r=d[1].d+1;
int t,sum,ans;
while(r-l>1)
{
while(top) add[S[top--]]=0;
int mid=(l+r)>>1;
for(t=1;t<=m;t++)
{
if(d[t].d<=mid) break;
add[d[t].u]++;
add[d[t].v]++;
add[d[t].ca]-=2;
}
t--;
sum=0,ans=0;
for(int i=n;i>=1;i--)
{
v=dfs_n[i];
if(add[v])
{
S[++top]=v;
add[fa[0][v]]+=add[v];
}
if(add[v]==t)ans=Max(ans,D[v]);
}
ans=Max(d[1].d-ans,d[t+1].d);
if(ans<=mid)r=mid;
else l=mid;
}
printf("%d\n",r);
return 0;
}