https://www.luogu.org/problem/P3128
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+100;
int n,k;
vector<int> G[maxn];
int fa[maxn][20],deep[maxn],d[maxn],ans;
void dfs(int u,int f)
{
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(v==f)continue;
fa[v][0]=u;
deep[v]=deep[u]+1;
dfs(v,u);
}
}
void lca_init()
{
for(int i=1;i<=n;i++)for(int j=1;(1<<j)<n;j++)fa[i][j]=-1;
for(int j=1;(1<<j)<n;j++)
for(int i=1;i<=n;i++)
if(fa[i][j-1]!=-1)
{
int a=fa[i][j-1];
fa[i][j]=fa[a][j-1];
}
}
int lca(int p,int q)
{
int log;
if(deep[p]<deep[q])swap(p,q);
for(log=1;(1<<log)<=deep[p];log++);
log--;
int ans=-(1<<30);
for(int i=log;i>=0;i--)
if(deep[p]-(1<<i)>=deep[q])
{
p=fa[p][i];
}
if(p==q)return p; //lca爲p或q
for(int i=log;i>=0;i--)
if(fa[p][i]!=-1 && fa[p][i]!=fa[q][i])
{
p=fa[p][i];
q=fa[q][i];
}
return fa[p][0];//lca爲fa[p]或fa[q]
}
int dfs2(int u,int f)
{
int cnt=d[u];
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(v==f)continue;
cnt+=dfs2(v,u);
}
ans=max(ans,cnt);
return cnt;
}
int main()
{
cin>>n>>k;
int a,b;
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
fa[1][0]=-1;
deep[1]=0;
dfs(1,-1);
lca_init();
while(k--)
{
scanf("%d%d",&a,&b);
int x=lca(a,b);
d[a]++;d[b]++;
d[x]--;
if(fa[x][0]>0)d[fa[x][0]]--;
}
dfs2(1,-1);
cout<<ans<<endl;
}