#include using namespace std; using ll = long long; using vi = vector; using pii = pair; using pll = pair; using vvi = vector; #define f(i,a,b) for(int i = (a); i < (b); i++) #define pb emplace_back #define PB push_back #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() #define dump(x) cout << #x << "=" << x << endl; void func(int v, vector> &tree, vector &ans, int num, int spacing, int offset) { vector neighbours = tree[v]; if(neighbours.size() == 0) { for (int i = 0; i < num; ++i) { ans[spacing * i + offset] = v; } } else { int first = num % neighbours.size(); int nnum = num / neighbours.size(); for (int i = 0; i < first; ++i) { func(neighbours[i], tree, ans, nnum + 1, spacing * neighbours.size(), offset + i*spacing); } for (int i = first; i < neighbours.size(); ++i) { func(neighbours[i], tree, ans, nnum, spacing * neighbours.size(), offset + i*spacing); } } } signed main() { int N, Q; cin >> Q >> N; vector> tree; f(i,0,Q) tree.emplace_back(); vi ans(N); int inp; for (int i = 1; i < Q; ++i) { cin >> inp; tree[inp].push_back(i); } func(0, tree, ans, N, 1, 0); for (int a:ans) { cout << a << "\n"; } cout << endl; return 0; }