代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
typedef long long ll;
vector<int> g[maxn];
int n,m,p[maxn][20],dep[maxn];
ll A[maxn],B[maxn],ans[maxn];
void prework(int u,int fa) {
A[u] = B[u] = 0;
if(u == 1) dep[u] = 1;
for(int i = 1; i <= 19; i++)
p[u][i] = p[p[u][i - 1]][i - 1];
for(auto it : g[u]) {
if(it == fa) continue;
p[it][0] = u;
dep[it] = dep[u] + 1;
prework(it,u);
}
}
int getlca(int x,int y) {
if(dep[x] < dep[y]) swap(x,y);
for(int i = 19; i >= 0; i--) {
if(dep[p[x][i]] >= dep[y])
x = p[x][i];
}
if(x == y) return x;
for(int i = 19; i >= 0; i--) {
if(p[x][i] != p[y][i])
x = p[x][i], y = p[y][i];
}
return p[x][0];
}
void dfs1(int u,int fa) {
for(auto it : g[u]) {
if(it == fa) continue;
dfs1(it,u);
A[u] += A[it];
B[u] += B[it];
}
}
void dfs2(int u,int fa) {
ans[u] += 1ll * A[u] * dep[u] + B[u];
for(auto it : g[u]) {
if(it == fa) continue;
ans[it] = ans[u];
dfs2(it,u);
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1,u,v; i < n; i++) {
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
prework(1,0);
for(int i = 1,u,v; i <= m; i++) {
scanf("%d%d",&u,&v);
int lca = getlca(u,v);
int l = dep[u] + dep[v] - 2 * dep[lca];
A[u] -= 2; A[v] -= 2; A[lca] += 4;
B[u] += 1 - l + 2 * dep[u];
B[v] += 1 - l + 2 * dep[v];
B[lca] -= (1 - l + 2 * dep[u]) + (1 - l + 2 * dep[v]);
int x = dep[u] - dep[lca];
ans[1] += 1ll * x * (l - x);
}
dfs1(1,0); dfs2(1,0);
for(int i = 1; i <= n; i++)
printf("%lld\n",ans[i]);
return 0;
}