https://loj.ac/problem/10131
#include<bits/stdc++.h>
using namespace std;
struct node{
int to,next;
}e[];
int head[],num=,N,n,m,ans;
int grand[][],depth[];
int f[],w[];
inline void add(int x,int y)
{
e[++num].to=y,e[num].next=head[x],head[x]=num;
}
inline void read(int &x)
{
x=;int f=;
char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
x*=f;
}
void dfs(int x)
{
for(int i=;i<=N;i++)grand[x][i]=grand[grand[x][i-]][i-];
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v==grand[x][])continue;
depth[v]=depth[x]+;
grand[v][]=x;
dfs(v);
}
}
void init()
{
N=floor(log(n+0.0)/log(2.0));
depth[]=;
dfs();
}
inline int lca(int a,int b)
{
if(depth[a]>depth[b]) swap(a,b);
for(register int i=N;i>=;i--)
{
if(depth[a]<depth[b]&&depth[grand[b][i]]>=depth[a]) b=grand[b][i];
}
if(a==b)return a;
for(register int i=N;i>=;i--)
{
if(grand[a][i]!=grand[b][i]){a=grand[a][i],b=grand[b][i];}
}
return grand[a][];
}
void solve(int u,int fa)
{
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;if(v==fa) continue;
solve(v,u);f[u]+=f[v];
}
}
int main()
{
read(n),read(m);
for(int i=;i<n;i++)
{
int u,v;
read(u),read(v);
add(u,v);
add(v,u);
}
init();
for(int i=;i<=m;i++)
{
int x,y;
read(x),read(y);
w[x]++;w[y]++;
w[lca(x,y)]-=;
}
for(int i=;i<=n;i++) f[i]=w[i];
solve(,);
for(int i=;i<=n;i++)
{
if(f[i]==) ans+=m;
else if(f[i]==) ans++;
}
cout<<ans;
}