感觉分类讨论没错?
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,k,r,p,vst;
ll a[500005],s=0;
int fa[500005],hs[500005],sz[500005],top[500005],dfn[500005],rdfn[500005],dep[500005];
vector<int>G[500005];
void dfs(int u,int fat) {
fa[u]=fat;
sz[u]=1;
dep[u]=dep[fat]+1;
for(auto &v:G[u]) {
if(v==fat)continue;
dfs(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[hs[u]])hs[u]=v;
}
}
void cut(int u,int tp) {
dfn[u]=++vst;
rdfn[vst]=u;
top[u]=tp;
if(hs[u]) {
cut(hs[u],tp);
for(auto &v:G[u])if(v!=fa[u]&&v!=hs[u])cut(v,v);
}
}
ll tr[800020],tg[800020];
void pup(int u) {
tr[u]=tr[u<<1]+tr[u<<1|1];
}
void build(int u,int le,int ri) {
if(le==ri) {
tr[u]=a[rdfn[le]];
return;
}
int mid=(le+ri)>>1;
build(u<<1,le,mid);
build(u<<1|1,mid+1,ri);
pup(u);
}
bool inr(int le,int ri,int L,int R) {
return (L<=le)&&(ri<=R);
}
bool otr(int le,int ri,int L,int R) {
return (le>R)||(ri<L);
}
int lca(int x,int y) {
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y])return x;
else return y;
}
ll query(int u,int le,int ri,int L,int R) {
if(inr(le,ri,L,R))return tr[u];
else if(!otr(le,ri,L,R)) {
int mid=(le+ri)>>1;
return query(u<<1,le,mid,L,R)+query(u<<1|1,mid+1,ri,L,R);
}
return 0;
}
ll qry(int x,int y) {
ll ans=0;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=query(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
return (ans+query(1,1,n,min(dfn[x],dfn[y]),max(dfn[x],dfn[y])));
}
void qr(int u,int v,int w){
int lu=lca(u,w),lv=lca(v,w),luv=lca(u,v);
if(lca(luv,w)==w)cout<<luv<<" "<<qry(w,luv)+qry(u,v)-2<<"\n";
else if(lca(u,w)==w&&lca(v,w)!=w)cout<<w<<" "<<qry(u,v)-1<<"\n";
else if(lca(u,w)!=w&&lca(v,w)==w)cout<<w<<" "<<qry(u,v)-1<<"\n";
else if(lu==lv)cout<<lu<<" "<<qry(w,lca(w,luv))+qry(luv,lca(w,luv))+qry(u,v)-3<<"\n";
else if(lu!=lv){
if(lca(lu,lv)==lu)cout<<lv<<" "<<qry(u,v)+qry(u,lv)-2<<"\n";
else cout<<lu<<" "<<qry(u,v)+qry(u,lu)-2<<"\n";
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1; i<=n; i++)a[i]=1;
for(int i=1; i<n; i++) {
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
cut(1,0);
build(1,1,n);
while(m-->0) {
int u,v,w;
cin>>u>>v>>w;
qr(u,v,w);
}
}