#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define ret return
#define fi first
#define se second
#define mp make_pair
#define all(x) x.begin(), x.end()
#define be(x) x.begin()
#define en(x) x.end()
#define sz(x) ll(x.size())
#define for0(i, n) for (ll   i = 0; i < (n); ++i)
#define for1(i, n) for (ll   i = 1; i < (n); ++i)
#define rfor0(i, n) for (ll   i = (n) - 1; i >= 0; --i)
#define rfor1(i, n) for (ll   i = (n) - 1; i >= 1; --i)
#define rep(i, a, n) for (ll   i = a; i < ll(n); ++i)
#define fastIO() ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define con continue
#define pb push_back
#define pob pop_back
#define rs resize
#define ba(a) a.back()
#define rsun(a) a.resize(unique(a.begin(), a.end())-a.begin())
#define endl '\n'
#ifdef OG_Matveychick1
bool local = true;
#else
bool local = false;
#endif
typedef long long ll;
typedef vector<ll> vll;
template<typename T1, typename T2>
inline void amin(T1 &a, T2 b) {
    a = min(a, b);
}
template<typename T1, typename T2>
inline void amax(T1 &a, T2 b) {
    a = max(a, b);
}
mt19937_64 rn(chrono::steady_clock::now().time_since_epoch().count());
//mt19937_64 rn(4);
ll rnd(ll l, ll r) {
    ll a = rn() % (r - l + 1) + l;
    return a;
}
void solve();
ll T = 1;
signed main(int argc, char **argv) {
//    setlocale(LC_ALL, "RUS");
    fastIO()
    cout.precision(12);
    cout << fixed;
    if (local && argc == 1) {
        freopen("input.txt", "r", stdin);
//        freopen("output.txt", "w", stdout);
    }
//    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}
struct node {
    vll a, b;
    vll ps;
    ll mn;
    node() {}
};
const ll N = 1e5 + 5, K = 60;
ll n, m, a[N], k, ans[N], up[K][N], used[N], dg[N], m1, ad[N], psb[N], cmp[N], gc[N], inc[N];
vector<node> nd;
ll go(ll v, ll s) {
    for0(i, K) if ((s >> i) & 1) v = up[i][v];
    ret v;
}
void prec() {
    for0(i, n) {
        if (used[i] || dg[i]) con;
        nd.pb(node());
        vll st;
        ll v = i;
        st.pb(v);
        used[v] = 1;
        while (!used[a[v]]) {
            v = a[v];
            st.pb(v);
            used[v] = 1;
        }
        bool fl = 0;
        for (auto x: st) {
            fl |= x == a[v];
            if (fl) {
                psb[x] = sz(ba(nd).b);
                ba(nd).b.pb(x);
                inc[x] = 1;
            } else {
                ba(nd).a.pb(x);
            }
        }
    }
    for0(i, n) {
        if (used[i]) con;
        nd.pb(node());
        vll st;
        ll v = i;
        st.pb(v);
        used[v] = 1;
        while (!used[a[v]]) {
            v = a[v];
            st.pb(v);
            used[v] = 1;
        }
        bool fl = 0;
        for (auto x: st) {
            fl |= x == a[v];
            if (fl) {
                psb[x] = sz(ba(nd).b);
                ba(nd).b.pb(x);
                inc[x] = 1;
            } else {
                ba(nd).a.pb(x);
            }
        }
    }
    for (auto &x: nd) x.ps.rs(2 * sz(x.b) + 1);
    for (auto &x: nd) {
        ll mn = 1e18;
        if (sz(x.a)) amin(mn, *min_element(all(x.a)));
        if (sz(x.b)) amin(mn, *min_element(all(x.b)));
        x.mn = mn;
    }
    sort(all(nd), [&](node &a, node &b) {
        ret a.mn < b.mn;
    });
    ll pv = 0;
    for (auto x: nd) {
        for (auto c: x.b) cmp[c] = pv;
        for (auto c: x.a) cmp[c] = pv;
        pv++;
    }
}
void solve1(vll c, ll k, ll m) {
    for (ll d = 1; d <= m; d++) {
        ll dc = m - d + 1;
        ll k1 = k;
        k1 %= dc;
        ll v;
        if (k1 == 0) {
            v = c[0];
            ans[v] += m - d;
        } else {
            v = d + k1 - 1;
            ans[c[v]] += v - d + 1;
            ans[c[k1]] += (m - d) - (v - d + 1);
        }
        dc = d + 1;
        k1 = k % dc;
        v = k1;
        ll pl = m - d;
        ll l = 0;
        while (pl > 0) {
            ll mn = min(pl, v - l + 1);
            ans[c[v]] += mn;
            pl -= mn;
            v += d + 1;
            l = v - d;
        }
    }
}
void solve2(vll c, ll p1, ll p2, ll k, ll m) {
    for (ll d = 1; d <= m; d++) {
        ll dc = d + 1;
        ll k1 = k % dc;
        ll v = k1;
        ll pl = m - d - max(0ll, (m - p2) - d);
        ll l = 0;
        while (pl > 0) {
            ll mn = min(pl, v - l + 1);
            ans[c[v]] += mn;
            pl -= mn;
            v += d + 1;
            l = v - d;
        }
    }
    for (ll d = 1; d <= m; d++) {
        ll dc = d + 1;
        ll k1 = k % dc;
        ll v = k1;
        ll pl = max(0ll, p1 - d);
        ll l = 0;
        while (pl > 0) {
            ll mn = min(pl, v - l + 1);
            ans[c[v]] -= mn;
            pl -= mn;
            v += d + 1;
            l = v - d;
        }
    }
}
void solve3(vll c, ll p1, ll fp, ll k, ll m, ll j) {
    for (ll d = 1; d <= m; d++) {
        ll dc = d + 1;
        ll k1 = k % dc;
        ll v = k1;
        ll pl = m - d - max(0ll, (m - p1) - d);
        ll l = 0;
        while (pl > 0) {
            ll mn = min(pl, v - l + 1);
            ll vp = (v < sz(c) ? c[v] : nd[j].b[(v - sz(c) + fp) % sz(nd[j].b)]);
            ans[vp] += mn;
            pl -= mn;
            v += d + 1;
            l = v - d;
        }
    }
    for (ll d = 1; d <= m; d++) {
        ll dc = d + 1;
        ll k1 = k % dc;
        ll v = k1;
        ll pl = max(0ll, p1 - d);
        ll l = 0;
        while (pl > 0) {
            ll mn = min(pl, v - l + 1);
            ll vp = (v < sz(c) ? c[v] : nd[j].b[(v - sz(c) + fp) % sz(nd[j].b)]);
            ans[vp] -= mn;
            pl -= mn;
            v += d + 1;
            l = v - d;
        }
    }
}
ll f(ll v) {
    if (gc[v] != -1) ret gc[v];
    ret gc[v] = (inc[v] ? v : f(go(ba(nd[cmp[v]].a), 1)));
}
void solve() {
    cin >> n >> k;
    for0(i, n) cin >> a[i], a[i]--, up[0][i] = a[i], dg[a[i]]++, gc[i] = -1;
    for1(i, K) for0(j, n) up[i][j] = up[i - 1][up[i - 1][j]];
    prec();
    for0(i, n) gc[i] = f(i);
    m = sz(nd[0].a);
    if (sz(nd[0].b)) m += sz(nd[0].b);
    else m += sz(nd[cmp[gc[0]]].b);
    ans[go(0, k)] += (n - m) * n; // из других компонент в нашу
    for (auto x: nd[0].a) { // из нашего хвоста куда-то
        if (x == 0) break;
        ans[go(0, k)] += n;
    }
    {   // петли в нашей компоненте после хвоста
        bool fl = 0;
        for (auto x: nd[0].a) {
            fl |= x == 0;
            ans[x] += fl;
            m1 += fl;
        }
        if (sz(nd[0].b)) for (auto x: nd[0].b) ans[x]++;
        else for (auto x: nd[cmp[gc[0]]].b) ans[x]++;
    }
    for1(i, sz(nd)) { // из нашей компоненты после хвоста в другие компоненты
        ll c = (sz(nd[i].a) ? cmp[gc[ba(nd[i].a)]] : cmp[nd[i].b[0]]);
        if (c) for (auto x: nd[c].b) ans[x] += m1 + (c == 0 ? 0 : sz(nd[0].b));
        for (auto x: nd[i].a) {
            ad[c] += (m1 + (c == 0 ? 0 : sz(nd[0].b))) / sz(nd[c].b);
            ll ost = (m1 + (c == 0 ? 0 : sz(nd[0].b))) % sz(nd[c].b);
            ll r = psb[go(x, k - 1)], l = r - ost + 1;
            r += sz(nd[c].b);
            l += sz(nd[c].b);
            nd[c].ps[l]++;
            nd[c].ps[r + 1]--;
        }
    }
    { // из нашего цикла в наш цикл
        ll k1;
        if (find(all(nd[0].a), 0) == en(nd[0].a)) k1 = k + psb[0];
        else k1 = k - (en(nd[0].a) - find(all(nd[0].a), 0));
        solve1(nd[0].b, k1, sz(nd[0].b));
    }
    { // из нашей компоненты после хвоста в наш цикл
        ll m2;
        if (find(all(nd[0].a), 0) == en(nd[0].a)) m2 = 0;
        else m2 = en(nd[0].a) - find(all(nd[0].a), 0);
        for (auto x: nd[0].b) ans[x] += m2;
    }
    if (find(all(nd[0].a), 0) != en(nd[0].a)) {
        { // из нашего хвоста в хвост ->
            ll D = en(nd[0].a) - find(all(nd[0].a), 0) - 1;
            for (ll d = 1; d <= D; d++) ans[go(0, k - (d - 1))] += D - d + 1;
        }
        { // + цикл в нашем хвосте
            ll k1 = k + (find(all(nd[0].a), 0) - be(nd[0].a));
            ll p = find(all(nd[0].a), 0) - be(nd[0].a);
            vll c;
            for (auto x: nd[0].a) c.pb(x);
            solve2(c, p, sz(nd[0].a), k1, sz(c));
        }
    }
    { // из нашего цикла в какой-то хвост
        ll j = (find(all(nd[0].b), 0) != en(nd[0].b) ? 0 : cmp[gc[ba(nd[0].a)]]);
        ll f = (find(all(nd[0].b), 0) != en(nd[0].b) ? 0 : cmp[gc[ba(nd[0].a)]]);
        ll dc = sz(nd[j].b);
        ll k2 = k - (find(all(nd[0].a), 0) == en(nd[0].a) ? 0 : en(nd[0].a) - find(all(nd[0].a), 0));
        for0(i, sz(nd)) {
            if (!sz(nd[i].a) || cmp[gc[ba(nd[i].a)]] != j) con;
            ll p1 = psb[gc[ba(nd[i].a)]];
            ll k1;
            k1 = k2 + (psb[f] - p1 + dc) % dc + sz(nd[i].a);
            solve3(nd[i].a, sz(nd[i].a), p1, k1, sz(nd[i].a) + sz(nd[j].b), j);
        }
    }
    for0(i, sz(nd)) {
        partial_sum(all(nd[i].ps), be(nd[i].ps));
        for0(j, sz(nd[i].b)) ans[nd[i].b[j]] += nd[i].ps[j] + nd[i].ps[j + sz(nd[i].b)];
        for (auto x: nd[i].b) ans[x] += ad[i];
    }
    for0(i, n) cout << ans[i] << endl;
}
컴파일 시 표준 에러 (stderr) 메시지
space_pirate.cpp: In function 'int main(int, char**)':
space_pirate.cpp:68:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |