#include <bits/stdc++.h>
using namespace std;
//
const int mx = 2e5 + 5;
//
int N, K;
int root, h[mx], up[20][mx];
vector<int> adj[mx], meeting[mx];
//
void DFS (int u = root)
{
    for (int v : adj[u])
    {
        if (v == up[0][u])
            continue;
        h[v] = h[u] + 1;
        up[0][v] = u;
        for (int i = 1; i < 20; ++i)
            up[i][v] = up[i - 1][up[i - 1][v]];
        DFS(v);
    }
}
int dist (int u, int v)
{
    int res = 0;
    //
    if (h[u] != h[v])
    {
        if (h[u] < h[v])
            swap(u, v);
        res = h[u] - h[v];
        for (int i = 0; (1 << i) <= res; ++i)
            if (res >> i & 1)
                u = up[i][u];
    }
    if (u == v)
        return res;
    for (int i = __lg(h[v]); i >= 0; --i)
        if (up[i][u] != up[i][v])
            res += 2 << i,
            u = up[i][u],
            v = up[i][v];
    return res + 2;
}
int solve (int idx)
{
    int u, tmp, res = 0;
    //
    u = meeting[idx].front();
    for (int v : meeting[idx])
        if (res < dist(u, v))
            res = dist(u, v),
            tmp = v;
    u = tmp;
    for (int v : meeting[idx])
        if (res < dist(u, v))
            res = dist(u, v);
    return res;
}
//
void process (void)
{
    cin >> N >> K;
    for (int i = 1; i <= N; ++i)
    {
        int x, y;
        //
        cin >> x >> y;
        meeting[x].emplace_back(i);
        if (y == 0)
            root = i;
        else
            adj[i].emplace_back(y),
            adj[y].emplace_back(i);
    }
    DFS();
    for (int i = 1; i <= K; ++i)
        cout << solve(i) << '\n';
}
//
signed main (void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    process();
}
