#include using namespace std; void solve() { int N, p; cin >> N >> p; std::vector A(N); for (auto& a : A) { cin >> a; a--; } auto B = A; for (int i = 0; i < N; i ++) { B[A[i]] = i; } vector ans(N); vector> C; { vector D(N, 0); for (int i =0; i < N; i ++) { if (D[i]) continue; vector X; int fl = i; while (!D[fl]) { D[fl] = 1; X.push_back(fl); fl = B[i]; } C.push_back(X); } } sort(C.begin(), C.end(), [](vector& a, vector& b) {return a.size() < b.size();}); { int fl = 0; while (fl < C.size()) { auto& v1 = C[fl]; if (v1.size() & 1) { int r = (p*2) % v1.size(); auto v2 = v1; for (long long i = 0; i < v1.size(); i ++) { v2[(i*r) % v1.size()] = v1[i]; } v2.push_back(v2[0]); for (int i = 0; i < v1.size(); i ++) { ans[v2[i]] = v2[i+1]; } } else if (fl + 1 < C.size() && C[fl].size() == C[fl+1].size()) { auto& v2 = C[++fl]; int s = v1.size(); vector X(s*2); int r = (2*p) % (s*2); for (long long i = 0; i < s; i ++) { X[(i*r) % (s*2)] = v1[i]; } for (long long i = 0; i < s; i ++) { X[(i*r) % (s*2)+1] = v2[i]; } X.push_back(X[0]); for (int i = 0; i < s*2; i ++) { ans[X[i]] = X[i+1]; } } else { int s = v1.size(); vector X(s-1); int r = (2*p) % (s-1); for (long long i = 0; i < s-1; i ++) { X[(i*r) % (s-1)] = v1[i]; } X.push_back(X[0]); for (int i = 0; i < s*2; i ++) { ans[X[i]] = X[i+1]; } ans[v1.back()] = X[(1-r+(s-1)) % (s-1)]; } fl ++; } } for(int i = 0; i < N; i ++) { cout << (i ? " " : "") << ans[i]+1; } cout << endl; } int main () { int T; cin >> T; while (T--) solve(); }