#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); string String() { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0); return _input[_iter++]; } T I() where T : IParsable => T.Parse(String(), null); #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); var n = I(); var m = I(); var edges = Range(n - 1, () => (I() - 1, I() - 1)); var passengers = Range(m, () => (I() - 1, I() - 1)); var ufz = new UnionFind[n - 1]; for (var i = n - 2; i >= 0; i--) { var uf = new UnionFind(n); for (var j = n - 2; j >= i; j--) { var (u, v) = edges[j]; uf.Union(u, v); } ufz[i] = uf; } var ans = new int[n - 1]; foreach (var (u, v) in passengers) { var pass = -1; var fail = n - 1; while (Math.Abs(pass - fail) >= 2) { var mid = (pass + fail) >> 1; var uf = ufz[mid]; if (uf.Find(u) == uf.Find(v)) pass = mid; else fail = mid; } if (pass > 0) ans[pass - 1]++; } for (var j = n - 2; j > 0; j--) ans[j - 1] += ans[j]; Console.WriteLine(string.Join(Environment.NewLine, ans)); class UnionFind { int[] Verticals { get; set; } public UnionFind(int verticals) { Verticals = new int[verticals]; for (int i = 0; i < verticals; i++) Verticals[i] = -1; } public int Union(int x, int y) { (x, y) = (Find(x), Find(y)); var (sx, sy) = (Size(x), Size(y)); if (sx < sy) (x, y, sy) = (y, x, sx); var (nx, ny) = (Verticals[x], Verticals[y]); if (x != y) { ny = x; nx -= sy; } (Verticals[y], Verticals[x]) = (ny, nx); return x; } public int Find(int x) { var pid = Verticals[x]; if (pid < 0) return x; var aid = Find(pid); Verticals[x] = aid; return aid; } public int Size(int x) => -Verticals[Find(x)]; }