#ifndef ONLINE_JUDGE
#include "/home/bgopc/template/pch.hpp"
#endif
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 2e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20;
typedef pair<int, int> pii;
int n, a[maxn], X[maxn], h[maxn], L, _map[2 * maxn], *mp = _map + maxn, up[maxn][LG], sz[maxn];
ll K, f[maxn], ps[2 * maxn];
bool vis[maxn];
vector<int> g[maxn], path, imp[2 * maxn], i2mp[2 * maxn];
void PreDfs(int v) {
for (int i = 1 ; i < LG ; i ++) up[v][i] = up[up[v][i - 1]][i - 1];
vis[v] = 1;
sz[v] = 1;
for (int u : g[v]) {
if (vis[u]) L = X[v];
else {
if (X[u] == -1) X[u] = X[v];
h[u] = h[v] + 1;
up[u][0] = v;
PreDfs(u);
sz[v] += sz[u];
}
}
}
int Kth(int v, int k) {
for (int i = 0 ; i < LG ; i ++) if (k >> i & 1) v = up[v][i];
return v;
}
void job(int v, int gL) {
vector<int> q;
for (;; v = a[v]) {
if (vis[v]) break;
q.pb(v);
vis[v] = 1;
}
reverse(q.begin(), q.end());
int L = 0;
while (q[L] != v) ++ L;
++ L;
ll cv = 0;
vector<int> add(L);
int KmL = K % L;
auto upd = [&](int d) {
int l = (d + 1 - KmL + L) % L;
int r = l + gL;
if (r - l > L) {
int d = (r - l) / L;
r -= d * L;
cv += d;
}
if (r < L) ++ add[l], -- add[r];
else ++ cv, -- add[r - L], ++ add[l];
};
auto dfs = [&](auto&& dfs, int v, int d) -> void {
upd(d);
vis[v] = 1;
for (int u : g[v]) {
if (!vis[u]) {
dfs(dfs, u, d + 1);
}
}
};
for (int i = 0 ; i < q.size() ; i ++)
dfs(dfs, q[i], i);
for (int i = 0 ; i < L ; i ++) f[q[i]] += (cv += add[i]);
}
void dfs1(int v, int sh) {
vis[v] = 1;
for (int u : g[v]) {
if (!vis[u]) {
dfs1(u, sh);
}
}
int d = h[v];
ll l = K - d - 1 - sh, r = K - d - 1;
ps[0] -= l / L;
ps[0] += r / L;
++ ps[l % L];
-- ps[r % L];
}
void dfs2(int v) {
vis[v] = 1;
for (int u : g[v]) {
if (!vis[u]) {
dfs2(u);
}
}
int D, E;
D = h[v] - (X[v] + 1);
E = mp[D];
if (E < h[v]) {
int t = Kth(v, h[v] - E);
if (D >= 0) f[t] += sz[v];
} else {
E -= D + 1;
if (D >= 0) f[path[E]] += sz[v];
}
D = h[v] - L;
E = mp[D];
if (E < h[v]) {
int t = Kth(v, h[v] - E);
f[t] -= sz[v];
} else {
E -= D + 1;
f[path[E]] -= sz[v];
}
int x = lower_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v] - X[v]) - upper_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v] - L);
f[v] += 1ll * x * sz[v];
ps[h[v]] += sz[v];
}
void dfs3(int v) {
vis[v] = 1;
for (int u : g[v]) {
if (!vis[u]) {
dfs3(u);
}
}
int D, E;
D = h[v];
if (D > 0) {
E = h[v] - (h[v] - mp[D] + D + 1) % (D + 1);
f[Kth(v, h[v] - E)] += sz[v];
}
D = h[v] - X[v] - 1;
if (D > 0) {
E = (h[v] - 1) - (h[v] - 1 - mp[D] + D + 1) % (D + 1);
f[Kth(v, h[v] - E)] -= sz[v];
}
int x = lower_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v]) - lower_bound(imp[h[v]].begin(), imp[h[v]].end(), h[v] - X[v]);
f[v] += 1ll * x * sz[v];
ps[h[v]] += sz[v];
}
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> K;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
g[a[i]].pb(i);
X[i] = -1;
}
for (int v = 1 ; ; v = a[v]) {
if (vis[v]) break;
vis[v] = 1;
path.pb(v);
}
fill(vis, vis + n + 1, 0);
reverse(path.begin(), path.end());
for (int i = 0 ; i < path.size() ; i ++) X[path[i]] = i;
PreDfs(path.front());
++ L;
f[path[L - (K - path.size()) % L - 1]] += 1ll * n * (n - path.size());
for (int i = 1 ; i <= n ; i ++)
if (!vis[i]) job(i, path.size());
if (L < path.size()) {
fill(vis, vis + n + 1, 0);
for (int v : path) vis[v] = 1;
for (int i = 0; i + 1 < path.size() ; i ++) {
dfs1(path[i], path.size() - max(L, i + 1));
}
ll cv = 0;
for (int i = 0 ; i < L ; i ++) {
f[path[L - i - 1]] += (cv += ps[i]);
}
fill(ps, ps + n + 1, 0);
}
for (int i = -L ; i <= n ; i ++) {
int nL = L + i + 1;
mp[i] = nL - (K - path.size() + L) % nL - 1;
imp[mp[i]].pb(i);
if (mp[i] > i - 1) i2mp[mp[i] - i - 1].pb(i);
}
fill(vis, vis + n + 1, 0);
for (int v : path) vis[v] = 1;
if (L < path.size()) {
for (int i = 0 ; i < L ; i ++) {
sz[path[i]] -= sz[path[L]];
}
}
for (int i = 0 ; i < L ; i ++) {
dfs2(path[i]);
for (int j : i2mp[i]) {
if (0 <= i + j + 1 && i + 1 < L) f[path[i]] -= ps[i + j + 1];
}
}
for (int i = -L ; i < 0 ; i ++) {
f[path[mp[i] - i - 1]] += sz[path[0]];
}
if (L < path.size()) {
for (int i = 0 ; i < L ; i ++) sz[path[i]] += sz[path[L]];
}
fill(ps, ps + n + 1, 0);
for (int i = 0 ; i <= n ; i ++) imp[i].clear();
for (int i = 1 ; i <= n ; i ++) {
mp[i] = i - (K - path.size()) % (i + 1);
for (int j = mp[i] ; j <= n ; j += i + 1) imp[j].pb(i);
}
fill(vis, vis + n + 1, 0);
for (int v : path) vis[v] = 1;
for (int i = path.size() - 1 ; i >= 0 ; i --) {
for (int x : imp[i]) {
if (i + x + 1 < n) f[path[i]] -= ps[i + x + 1];
}
dfs3(path[i]);
}
for (int v : path) ++ f[v];
for (int i = 1 ; i <= n ; i ++) cout << f[i] << ' ';
cout << nl;
return 0;
}