66pts TLE
#include<bits/stdc++.h>
using namespace std;
void dfs(int x);
int lca(int x,int y);
void solve(int x,int y);
int get_maxF(int x);
struct NODE{
int fir,d,dp,f[30];
}p[50005];
struct EDGE{
int v,nxt;
void add(int U,int V,int id){
v=V;
nxt=p[U].fir;
p[U].fir=id;
}
}e[100005];
int n,k;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=2*n-2;i+=2){
int u,v;
scanf("%d%d",&u,&v);
e[i].add(u,v,i);
e[i+1].add(v,u,i+1);
}
p[1].dp=1;
dfs(1);
for(int i=1;i<=k;++i){
int x,y;
scanf("%d%d",&x,&y);
solve(x,y);
}
printf("%d",get_maxF(1));
return 0;
}
void dfs(int x){
for(int i=p[x].fir;i;i=e[i].nxt){
int v=e[i].v;
if(v==p[x].f[0])continue;
p[v].f[0]=x;
p[v].dp=p[x].dp+1;
dfs(v);
}
for(int i=1;i<=20;++i){
p[x].f[i]=p[p[x].f[i-1]].f[i-1];
}
}
int lca(int x,int y){
int dp_x=p[x].dp,dp_y=p[y].dp,j=0;
if(dp_x==dp_y){
if(x==y)return x;
for(;p[x].f[j]!=p[y].f[j];++j);
if(j==0)return p[x].f[0];
else return lca(p[x].f[j-1],p[y].f[j-1]);
}else{
if(dp_x>dp_y){
for(;p[p[x].f[j]].dp>=p[y].dp;++j);
return lca(p[x].f[j-1],y);
}else{
for(;p[p[y].f[j]].dp>=p[x].dp;++j);
return lca(x,p[y].f[j-1]);
}
}
}
void solve(int x,int y){
int f=lca(x,y);
++p[x].d,++p[y].d;
--p[f].d,--p[p[f].f[0]].d;
}
int get_maxF(int x){
int ans=0;
for(int i=p[x].fir;i;i=e[i].nxt){
int v=e[i].v;
if(v==p[x].f[0])continue;
ans=max(get_maxF(v),ans);
p[x].d+=p[v].d;
}
return max(ans,p[x].d);
}
6pts WA
#include<bits/stdc++.h>
using namespace std;
void dfs(int x);
int lca(int x,int y);
void solve(int x,int y);
int get_maxF(int x);
struct NODE{
int fir,d,dp,f[30];
}p[50005];
struct EDGE{
int v,nxt;
void add(int U,int V,int id){
v=V;
nxt=p[U].fir;
p[U].fir=id;
}
}e[100005];
int n,k;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=2*n-2;i+=2){
int u,v;
scanf("%d%d",&u,&v);
e[i].add(u,v,i);
e[i+1].add(v,u,i+1);
}
p[1].dp=1;
dfs(1);
for(int i=1;i<=k;++i){
int x,y;
scanf("%d%d",&x,&y);
solve(x,y);
}
printf("%d",get_maxF(1));
return 0;
}
void dfs(int x){
for(int i=p[x].fir;i;i=e[i].nxt){
int v=e[i].v;
if(v==p[x].f[0])continue;
p[v].f[0]=x;
p[v].dp=p[x].dp+1;
dfs(v);
}
for(int i=1;i<=20;++i){
p[x].f[i]=p[p[x].f[i-1]].f[i-1];
}
}
int lca(int x,int y){
if(x==y)return x;
if(p[x].dp<p[y].dp)swap(x,y);
for(int i=20;i>=0;--i){
if(p[p[x].f[i]].dp>=p[y].dp)x=p[x].f[i];
}
for(int i=20;i>=0;--i){
if(p[x].f[i]!=p[y].f[i])x=p[x].f[i],y=p[y].f[i];
}
return x;
}
void solve(int x,int y){
int f=lca(x,y);
++p[x].d,++p[y].d;
--p[f].d,--p[p[f].f[0]].d;
}
int get_maxF(int x){
int ans=0;
for(int i=p[x].fir;i;i=e[i].nxt){
int v=e[i].v;
if(v==p[x].f[0])continue;
ans=max(get_maxF(v),ans);
p[x].d+=p[v].d;
}
return max(ans,p[x].d);
}