#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const ll LINF = 1e18;
const int INF = 1e9;
// - Đây là một bài tuy không khó nhưng đòi hỏi các em phải nháp và vẽ vời ra một tí để thấy
// - Gọi a(k)(i) là giá trị của phần tử nằm ở vị trí thứ i sau k thao tác biến đổi
// - Ta có a(k)(i) = a(k - 1)(x(i)) = a(k - 2)(x(x(i))) = a(k - 3)(x(x(x(i)))) = ... = a(0)(x(...x(...x(i)))) (*)
// - Từ đây ta dựng đồ thị có các cạnh nối i -> x(i), đây là dạng đồ thị có tính chất đặc biệt: mỗi đỉnh chỉ có đúng một cung đi ra (functional graph)
// - Dựa vào tính chất đó ta có thể áp dụng Binary Lifting để giải
// - Dãy biến đổi (*) chỉ đơn giản là ta xuất phát ở đỉnh i và nhảy k bước thì sẽ đến được đỉnh nào?
const int N = 2e5 + 5;
const int LOG = 60;
int n; ll k;
int x[N];
int a[N];
int nxt[LOG][N]; // nxt[i][u]: là đỉnh mà ta đến được nếu xuất phát từ đỉnh u và nhảy 2^i bước
void precompute() {
for (int u = 1; u <= n; u++) nxt[0][u] = x[u];
for (int i = 1; i < LOG; i++) {
for (int u = 1; u <= n; u++) {
nxt[i][u] = nxt[i - 1][nxt[i - 1][u]];
}
}
}
// int jump_brute(int u, int k) {
// for (int i = 1; i <= k; i++) u = x[u];
// return u;
// }
// Đỉnh mà ta đến được nếu xuất phát từ đỉnh u và nhảy k bước
int jump(int u, ll k) {
for (int i = 0; i < LOG; i++) {
if ((k >> i) & 1) {
u = nxt[i][u];
}
}
return u;
}
int ans[N];
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> x[i];
for (int i = 1; i <= n; i++) cin >> a[i];
precompute();
for (int i = 1; i <= n; i++) {
ans[i] = a[jump(i, k)];
}
for (int i = 1; i <= n; i++) cout << ans[i] << ' ';
}