class PersistentArray: B = 20 class Node: def __init__(self, val): self.val = val self.ch = [None] * PersistentArray.B def __init__(self, root=None, default=0): self.root = root self.default = default def _get(self, node, k: int): if node is None: return self.default if k == 0: return node.val d, m = divmod(k, self.B) return self._get(node.ch[m], d) def _set(self, node, k: int, val): res = PersistentArray.Node(self.default) if node is not None: res.val = node.val res.ch = node.ch[:] if k == 0: res.val = val else: d, m = divmod(k, self.B) res.ch[m] = self._set(res.ch[m], d, val) return res def get(self, k: int): return self._get(self.root, k) def set(self, k: int, val): return PersistentArray(self._set(self.root, k, val), self.default) class PersistentUnionFind: def __init__(self, parray): self.parray = parray def _get(self, a: int): return self.parray.get(a) def root(self, a: int): p = self._get(a) if p < 0: return a return self.root(p) def unite(self, a: int, b: int): pa = self.root(a) pb = self.root(b) if pa == pb: return self u = self._get(pa) v = self._get(pb) if u > v: pa, pb = pb, pa parray = self.parray.set(pa, u+v).set(pb, pa) return PersistentUnionFind(parray) def is_same(self, a: int, b: int) -> bool: return self.root(a) == self.root(b) @staticmethod def empty(): return PersistentUnionFind(PersistentArray(root=None, default=-1)) from itertools import accumulate N, M = map(int, input().split()) edges = [] for _ in range(N-1): u, v = map(lambda x: int(x)-1, input().split()) edges.append((u, v)) xs = [] for _ in range(M): s, t = map(lambda x: int(x)-1, input().split()) xs.append((s, t)) ufs = [PersistentUnionFind.empty()] # 線路の廃線を逆からみる for u, v in reversed(edges): ufs.append(ufs[-1].unite(u, v)) if 1: exit() ps = [0] * N for s, t in xs: lo = 0 hi = len(ufs)-1 res = hi while lo <= hi: m = (lo + hi) // 2 if ufs[m].is_same(s, t): res = min(res, m) hi = m - 1 else: lo = m + 1 ps[res] += 1 ps.pop() acc = list(accumulate(ps)) print(*reversed(acc), sep='\n')