#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
const int N = 2e5 + 8;
int n, k, root;
vector<int> g[N], group[N >> 1];
int h[N], up[N][18];
void dfs(int u) {
for (int v : g[u]) {
h[v] = h[u] + 1;
for (int j = 1; j < 18; ++j)
up[v][j] = up[up[v][j - 1]][j - 1];
dfs(v);
}
}
int lca(int u, int v) {
if (h[u] != h[v]) {
if (h[u] < h[v]) swap(u, v);
int k = h[u] - h[v];
for (int j = 0; (1 << j) <= k; ++j)
if (k >> j & 1)
u = up[u][j];
}
if (u == v) return u;
int k = __lg(h[u]);
for (int j = k; j >= 0; --j)
if (up[u][j] != up[v][j])
u = up[u][j], v = up[v][j];
return up[u][0];
}
int dist(int u, int v) {
int p = lca(u, v);
return h[u] + h[v] - 2 * h[p];
}
int diameter(vector<int> &meeting) {
int A = meeting[0], max_dist = 0, B = A, d;
for (int x : meeting) {
d = dist(A, x);
if (max_dist < d) {
max_dist = d;
B = x;
}
}
max_dist = 0;
for (int x : meeting) {
d = dist(B, x);
max_dist = max(max_dist, d);
}
return max_dist;
}
int main() {
cin.tie(NULL)->sync_with_stdio(false);
cin >> n >> k;
for (int i = 1, x; i <= n; ++i) {
cin >> x >> up[i][0];
group[x].push_back(i);
g[up[i][0]].push_back(i);
if (up[i][0] == 0) root = i;
}
dfs(root);
for (int i = 1; i <= k; ++i)
cout << diameter(group[i]) << '\n';
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDJlNSArIDg7CmludCBuLCBrLCByb290Owp2ZWN0b3I8aW50PiBnW05dLCBncm91cFtOID4+IDFdOwoKaW50IGhbTl0sIHVwW05dWzE4XTsKCnZvaWQgZGZzKGludCB1KSB7CiAgICBmb3IgKGludCB2IDogZ1t1XSkgewogICAgICAgIGhbdl0gPSBoW3VdICsgMTsKCiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCAxODsgKytqKQogICAgICAgICAgICB1cFt2XVtqXSA9IHVwW3VwW3ZdW2ogLSAxXV1baiAtIDFdOwoKICAgICAgICBkZnModik7CiAgICB9Cn0KCmludCBsY2EoaW50IHUsIGludCB2KSB7CiAgICBpZiAoaFt1XSAhPSBoW3ZdKSB7CiAgICAgICAgaWYgKGhbdV0gPCBoW3ZdKSBzd2FwKHUsIHYpOwoKICAgICAgICBpbnQgayA9IGhbdV0gLSBoW3ZdOwogICAgICAgIGZvciAoaW50IGogPSAwOyAoMSA8PCBqKSA8PSBrOyArK2opCiAgICAgICAgICAgIGlmIChrID4+IGogJiAxKQogICAgICAgICAgICAgICAgdSA9IHVwW3VdW2pdOwogICAgfQogICAgaWYgKHUgPT0gdikgcmV0dXJuIHU7CgogICAgaW50IGsgPSBfX2xnKGhbdV0pOwogICAgZm9yIChpbnQgaiA9IGs7IGogPj0gMDsgLS1qKQogICAgICAgIGlmICh1cFt1XVtqXSAhPSB1cFt2XVtqXSkKICAgICAgICAgICAgdSA9IHVwW3VdW2pdLCB2ID0gdXBbdl1bal07CiAgICByZXR1cm4gdXBbdV1bMF07Cn0KCmludCBkaXN0KGludCB1LCBpbnQgdikgewogICAgaW50IHAgPSBsY2EodSwgdik7CiAgICByZXR1cm4gaFt1XSArIGhbdl0gLSAyICogaFtwXTsKfQoKaW50IGRpYW1ldGVyKHZlY3RvcjxpbnQ+ICZtZWV0aW5nKSB7CiAgICBpbnQgQSA9IG1lZXRpbmdbMF0sIG1heF9kaXN0ID0gMCwgQiA9IEEsIGQ7CgogICAgZm9yIChpbnQgeCA6IG1lZXRpbmcpIHsKICAgICAgICBkID0gZGlzdChBLCB4KTsKICAgICAgICBpZiAobWF4X2Rpc3QgPCBkKSB7CiAgICAgICAgICAgIG1heF9kaXN0ID0gZDsKICAgICAgICAgICAgQiA9IHg7CiAgICAgICAgfQogICAgfQoKICAgIG1heF9kaXN0ID0gMDsKICAgIGZvciAoaW50IHggOiBtZWV0aW5nKSB7CiAgICAgICAgZCA9IGRpc3QoQiwgeCk7CiAgICAgICAgbWF4X2Rpc3QgPSBtYXgobWF4X2Rpc3QsIGQpOwogICAgfQogICAgcmV0dXJuIG1heF9kaXN0Owp9CgppbnQgbWFpbigpIHsKICAgIGNpbi50aWUoTlVMTCktPnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4gPj4gbiA+PiBrOwogICAgZm9yIChpbnQgaSA9IDEsIHg7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgY2luID4+IHggPj4gdXBbaV1bMF07CiAgICAgICAgZ3JvdXBbeF0ucHVzaF9iYWNrKGkpOwogICAgICAgIGdbdXBbaV1bMF1dLnB1c2hfYmFjayhpKTsKICAgICAgICBpZiAodXBbaV1bMF0gPT0gMCkgcm9vdCA9IGk7CiAgICB9CgogICAgZGZzKHJvb3QpOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGs7ICsraSkKICAgICAgICBjb3V0IDw8IGRpYW1ldGVyKGdyb3VwW2ldKSA8PCAnXG4nOwp9