#define _USE_MATH_DEFINES #include using namespace std; using ul = unsigned long long; using ll = int; using ld = long double; using pll = pair; #define in(v,c) ((c).find(v) != (c).end()) #define F(i,n) for(ll i = 0; i < (ll)(n); i++) #define Fun(i,n) for(ul i = 0; i < (n); i++) #ifdef GPD templatevoid lerr(F&&f){cerr<(f)<void lerr(F&&f,R&&...r){cerr<(f)<<' ';lerr(forward(r)...);} #else #define lerr(...) #endif ll n, q; vector> e; void solve(ll cur, ll parent, ll amount, vector & ret) { if(e[cur].size() == 0 ) { ret = vector(amount, cur); return; } if(e[cur].size() == 1 && parent == -1) { solve(e[cur].front(), cur, amount, ret); return; } if(e[cur].size() == 1) { ret = vector(amount, cur); return; } ll sons = e[cur].size() - (parent == -1? 0 : 1); ll q_sons = amount / sons; ll offset = q_sons - amount * sons; vector> sonsCombination; sonsCombination.reserve(sons); F(i, e[cur].size()) { if(e[cur][i] == parent) continue; ll q_sons_i = q_sons; if(offset) { q_sons_i++; offset--; } sonsCombination.push_back({}); solve(e[cur][i], cur, q_sons_i, sonsCombination.back()); } ll counter = 0; ll idx = 0; while(true) { for(ll i = 0; i < sons; i++) { ret.push_back(sonsCombination[i][idx]); counter++; if(counter >= amount) return; } idx++; } } int main() { cin >> n >> q; e = vector>(n); for(ll i= 1; i < n; i++) { ll p; cin >> p; e[i].push_back(p); e[p].push_back(i); } vector ret; solve(0, -1, q, ret); F(i,ret.size()) cout << ret[i] << endl; return 0; }