#include<bits/stdc++.h>
using namespace std;
#define ls(x) (1<<x)
#define rs(x) ((1<<x)|1)
#define rt(x) (x>>1)
#define int long long
int n,k;
struct SegmentTree{
int f[1100000],tag[1100000];
void updata(int x,int l,int r,int val){
tag[x]=tag[x]+val;
f[x]=f[x]+val;
}
void pushUp(int x){
f[x]=max(f[ls(x)],f[rs(x)]);
}
void pushDown(int x,int l,int r){
int mid=((l+r)>>1);
updata(ls(x),l,mid,tag[x]);
updata(rs(x),mid+1,r,tag[x]);
tag[x]=0;
}
void modify(int x,int l,int r,int tl,int tr,int val){
if(l>=tl&&r<=tr){
updata(x,l,r,val);
return ;
}
pushDown(x,l,r);
int mid=(l+r)>>1;
if(tl<=mid){
modify(ls(x),l,mid,tl,tr,val);
}
if(tr>=mid+1){
modify(rs(x),mid+1,r,tl,tr,val);
}
pushUp(x);
}
int query(int x,int l,int r,int tl,int tr){
int ans=0;
if(l>=tl&&r<=tr){
return ans=f[x];
}
pushDown(x,l,r);
int mid=(l+r)>>1;
if(tl<=mid){
ans=max(ans,query(ls(x),l,mid,tl,tr));
}
if(tr>=mid+1){
ans=max(ans,query(rs(x),mid+1,r,tl,tr));
}
return ans;
}
} ST;
struct Edge{
int next,to;
} a[11000000];
int head[1100000],cnt;
void addEdge(int x,int y){
a[++cnt].next=head[x];
head[x]=cnt;
a[cnt].to=y;
}
int fa[1100000],size[1100000],son[1100000],id[1100000],deep[1100000],top[1100000];
void dfs1(int x,int fax){
int maxx=0;
deep[x]=deep[fax]+1;
fa[x]=fax;
size[x]=1;
for(int i=head[x];i;i=a[i].next){
if(a[i].to==fax){
continue;
}
dfs1(a[i].to,x);
size[x]=size[x]+size[a[i].to];
if(maxx<size[a[i].to]){
maxx=size[a[i].to];
son[x]=a[i].to;
}
}
}
int idcnt=0;
void dfs2(int x,int fax){
id[x]=++idcnt;
top[son[x]]=top[x];
if(!son[x]){
return ;
}
dfs2(son[x],x);
for(int i=head[x];i;i=a[i].next){
if(a[i].to==fax||a[i].to==son[x]){
continue;
}
dfs2(a[i].to,x);
}
}
void IntervalModify(int l,int r,int val){
if(deep[top[l]]<deep[top[r]]){
swap(l,r);
}
if(fa[top[l]]==fa[top[r]]){
if(id[l]>id[r]){
swap(l,r);
}
ST.modify(1,1,n,id[l],id[r],val);
return ;
}
ST.modify(1,1,n,id[top[l]],id[l],val);
IntervalModify(fa[top[l]],r,val);
}
int IntervalQuery(int l,int r){
return ST.query(1,1,n,l,r);
}
signed main(){
cin>>n>>k;
for(int i=1;i<=n-1;i++){
int x,y;
cin>>x>>y;
addEdge(x,y);
addEdge(y,x);
top[i]=i;
}
top[n]=n;
dfs1(1,0);
dfs2(1,1);
while(k--){
int x,y;
cin>>x>>y;
IntervalModify(x,y,1);
}
cout<<IntervalQuery(1,n)<<'\n';
return 0;
}
提交记录