#include<bits/stdc++.h>
using namespace std;
const int mx=2e5+5;
int n, m;
vector<int> adj[mx];
int up[mx][20], dep[mx];
int val[mx]; // Mảng hiệu
void dfs_lca(int u, int p) {
dep[u] = dep[p] + 1;
up[u][0] = p;
for(int i=1; i<20; ++i)
up[u][i] = up[up[u][i-1]][i-1];
for(int v : adj[u]) {
if(v != p) dfs_lca(v, u);
}
}
int lca(int u, int v) {
if(dep[u] < dep[v]) swap(u, v);
for(int i=19; i>=0; --i) {
if(dep[u] - (1<<i) >= dep[v])
u = up[u][i];
}
if(u == v) return u;
for(int i=19; i>=0; --i) {
if(up[u][i] != up[v][i]) {
u = up[u][i];
v = up[v][i];
}
}
return up[u][0];
}
// DFS thứ 2 để cộng dồn từ dưới lên
void dfs_sum(int u, int p) {
for(int v : adj[u]) {
if(v != p) {
dfs_sum(v, u);
val[u] += val[v]; // Cộng dồn từ con lên cha
}
}
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
if(fopen("Counting_Paths.inp","r"))
{
freopen("Counting_Paths.inp","r",stdin);
freopen("Counting_Paths.out","w",stdout);
}
cin >> n >> m;
for(int i=1; i<n; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs_lca(1, 0);
while(m--) {
int a, b;
cin >> a >> b;
int p = lca(a, b);
// Công thức mảng hiệu trên cây
val[a]++;
val[b]++;
val[p]--;
if(up[p][0] != 0) val[up[p][0]]--; // Trừ ở bố của LCA
}
dfs_sum(1, 0);
for(int i=1; i<=n; ++i) cout << val[i] << ' ';
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IG14PTJlNSs1OwppbnQgbiwgbTsKdmVjdG9yPGludD4gYWRqW214XTsKaW50IHVwW214XVsyMF0sIGRlcFtteF07CmludCB2YWxbbXhdOyAvLyBN4bqjbmcgaGnhu4d1Cgp2b2lkIGRmc19sY2EoaW50IHUsIGludCBwKSB7CiAgICBkZXBbdV0gPSBkZXBbcF0gKyAxOwogICAgdXBbdV1bMF0gPSBwOwogICAgZm9yKGludCBpPTE7IGk8MjA7ICsraSkKICAgICAgICB1cFt1XVtpXSA9IHVwW3VwW3VdW2ktMV1dW2ktMV07CiAgICAgICAgCiAgICBmb3IoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICBpZih2ICE9IHApIGRmc19sY2EodiwgdSk7CiAgICB9Cn0KCmludCBsY2EoaW50IHUsIGludCB2KSB7CiAgICBpZihkZXBbdV0gPCBkZXBbdl0pIHN3YXAodSwgdik7CiAgICBmb3IoaW50IGk9MTk7IGk+PTA7IC0taSkgewogICAgICAgIGlmKGRlcFt1XSAtICgxPDxpKSA+PSBkZXBbdl0pIAogICAgICAgICAgICB1ID0gdXBbdV1baV07CiAgICB9CiAgICBpZih1ID09IHYpIHJldHVybiB1OwogICAgZm9yKGludCBpPTE5OyBpPj0wOyAtLWkpIHsKICAgICAgICBpZih1cFt1XVtpXSAhPSB1cFt2XVtpXSkgewogICAgICAgICAgICB1ID0gdXBbdV1baV07CiAgICAgICAgICAgIHYgPSB1cFt2XVtpXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdXBbdV1bMF07Cn0KCi8vIERGUyB0aOG7qSAyIMSR4buDIGPhu5luZyBk4buTbiB04burIGTGsOG7m2kgbMOqbgp2b2lkIGRmc19zdW0oaW50IHUsIGludCBwKSB7CiAgICBmb3IoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICBpZih2ICE9IHApIHsKICAgICAgICAgICAgZGZzX3N1bSh2LCB1KTsKICAgICAgICAgICAgdmFsW3VdICs9IHZhbFt2XTsgLy8gQ+G7mW5nIGThu5NuIHThu6sgY29uIGzDqm4gY2hhCiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGNpbi50aWUoMCktPnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGlmKGZvcGVuKCJDb3VudGluZ19QYXRocy5pbnAiLCJyIikpCiAgICB7CiAgICAgICAgZnJlb3BlbigiQ291bnRpbmdfUGF0aHMuaW5wIiwiciIsc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIkNvdW50aW5nX1BhdGhzLm91dCIsInciLHN0ZG91dCk7CiAgICB9CiAgICAKICAgIGNpbiA+PiBuID4+IG07CiAgICBmb3IoaW50IGk9MTsgaTxuOyArK2kpIHsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KICAgIAogICAgZGZzX2xjYSgxLCAwKTsKCiAgICB3aGlsZShtLS0pIHsKICAgICAgICBpbnQgYSwgYjsKICAgICAgICBjaW4gPj4gYSA+PiBiOwogICAgICAgIGludCBwID0gbGNhKGEsIGIpOwogICAgICAgIAogICAgICAgIC8vIEPDtG5nIHRo4bupYyBt4bqjbmcgaGnhu4d1IHRyw6puIGPDonkKICAgICAgICB2YWxbYV0rKzsKICAgICAgICB2YWxbYl0rKzsKICAgICAgICB2YWxbcF0tLTsKICAgICAgICBpZih1cFtwXVswXSAhPSAwKSB2YWxbdXBbcF1bMF1dLS07IC8vIFRy4burIOG7nyBi4buRIGPhu6dhIExDQQogICAgfQogICAgCiAgICBkZnNfc3VtKDEsIDApOwoKICAgIGZvcihpbnQgaT0xOyBpPD1uOyArK2kpIGNvdXQgPDwgdmFsW2ldIDw8ICcgJzsKICAgIHJldHVybiAwOwp9Cg==