#include <bits/stdc++.h>
using namespace std;
vector<int> countVisitedShops(vector<int>& paths) {
int n = paths.size();
vector<int> dp(n, 0), state(n, 0); // 0=unvisited, 1=visiting, 2=done
vector<int> stackOrder;
function<int(int)> dfs = [&](int u) -> int {
if (state[u] == 2) return dp[u]; // already computed
if (state[u] == 1) { // found cycle
int cnt = 1;
for (int i = stackOrder.size() - 1; i >= 0; i--) {
cnt++;
if (stackOrder[i] == u) break;
}
dp[u] = cnt - 1;
return dp[u];
}
state[u] = 1;
stackOrder.push_back(u);
int v = paths[u];
int res = dfs(v);
if (dp[u] == 0) dp[u] = res + (state[v] != 1 ? 1 : 0);
state[u] = 2;
stackOrder.pop_back();
return dp[u];
};
for (int i = 0; i < n; i++)
if (state[i] == 0) dfs(i);
return dp;
}
int main() {
int n;
cin >> n;
vector<int> paths(n);
for (int i = 0; i < n; i++) cin >> paths[i];
vector<int> result = countVisitedShops(paths);
for (int x : result) cout << x << " ";
cout << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50PiBjb3VudFZpc2l0ZWRTaG9wcyh2ZWN0b3I8aW50PiYgcGF0aHMpIHsKICAgIGludCBuID0gcGF0aHMuc2l6ZSgpOwogICAgdmVjdG9yPGludD4gZHAobiwgMCksIHN0YXRlKG4sIDApOyAvLyAwPXVudmlzaXRlZCwgMT12aXNpdGluZywgMj1kb25lCiAgICB2ZWN0b3I8aW50PiBzdGFja09yZGVyOwoKICAgIGZ1bmN0aW9uPGludChpbnQpPiBkZnMgPSBbJl0oaW50IHUpIC0+IGludCB7CiAgICAgICAgaWYgKHN0YXRlW3VdID09IDIpIHJldHVybiBkcFt1XTsgICAgICAgLy8gYWxyZWFkeSBjb21wdXRlZAogICAgICAgIGlmIChzdGF0ZVt1XSA9PSAxKSB7ICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGN5Y2xlCiAgICAgICAgICAgIGludCBjbnQgPSAxOwogICAgICAgICAgICBmb3IgKGludCBpID0gc3RhY2tPcmRlci5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgY250Kys7CiAgICAgICAgICAgICAgICBpZiAoc3RhY2tPcmRlcltpXSA9PSB1KSBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkcFt1XSA9IGNudCAtIDE7CiAgICAgICAgICAgIHJldHVybiBkcFt1XTsKICAgICAgICB9CgogICAgICAgIHN0YXRlW3VdID0gMTsKICAgICAgICBzdGFja09yZGVyLnB1c2hfYmFjayh1KTsKICAgICAgICBpbnQgdiA9IHBhdGhzW3VdOwogICAgICAgIGludCByZXMgPSBkZnModik7CiAgICAgICAgaWYgKGRwW3VdID09IDApIGRwW3VdID0gcmVzICsgKHN0YXRlW3ZdICE9IDEgPyAxIDogMCk7CiAgICAgICAgc3RhdGVbdV0gPSAyOwogICAgICAgIHN0YWNrT3JkZXIucG9wX2JhY2soKTsKICAgICAgICByZXR1cm4gZHBbdV07CiAgICB9OwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgIGlmIChzdGF0ZVtpXSA9PSAwKSBkZnMoaSk7CgogICAgcmV0dXJuIGRwOwp9CgppbnQgbWFpbigpIHsKICAgIGludCBuOwogICAgY2luID4+IG47CiAgICB2ZWN0b3I8aW50PiBwYXRocyhuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjaW4gPj4gcGF0aHNbaV07CgogICAgdmVjdG9yPGludD4gcmVzdWx0ID0gY291bnRWaXNpdGVkU2hvcHMocGF0aHMpOwogICAgZm9yIChpbnQgeCA6IHJlc3VsdCkgY291dCA8PCB4IDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9Cg==