#include using namespace std; typedef long long ll; typedef unsigned long long ull; int WIN_TBL[3][3] = { {-1, 0, 2}, { 0,-1, 1}, { 2, 1,-1} }; const int MAXN = 200002; int par[2*MAXN], lc[2*MAXN], rc[2*MAXN]; ll dp[2*MAXN][3]; int root_node; int N_global; void combine(int v) { ll* dl = dp[lc[v]]; ll* dr = dp[rc[v]]; ll* res = dp[v]; res[0] = res[1] = res[2] = 0; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (WIN_TBL[i][j] != -1) res[WIN_TBL[i][j]] += dl[i] * dr[j]; } void update_up(int leaf) { int v = par[leaf]; while (v != -1) { combine(v); v = par[v]; } } void solve() { int N; ll K; cin >> N >> K; vector A(N-1); for (int& x : A) cin >> x; vector prev_slot(2*N, -1), next_slot(2*N, -1); for (int i = 0; i < N; i++) { prev_slot[i] = i-1; next_slot[i] = (i < N-1) ? i+1 : -1; } vector bit(N+1, 0); auto bit_update = [&](int i, int val) { for (i++; i <= N; i += i & (-i)) bit[i] += val; }; auto bit_query = [&](int i) { int s = 0; for (i++; i > 0; i -= i & (-i)) s += bit[i]; return s; }; auto kth = [&](int k) -> int { int pos = 0; for (int pw = 1 << 18; pw; pw >>= 1) if (pos + pw <= N && bit[pos + pw] < k) { pos += pw; k -= bit[pos]; } return pos; }; for (int i = 0; i < N; i++) bit_update(i, 1); fill(par, par + 2*N, -1); int next_node = N; vector orig_to_node(N); iota(orig_to_node.begin(), orig_to_node.end(), 0); vector node_left(2*N, 0); fill(bit.begin(), bit.end(), 0); for (int i = 0; i < N; i++) bit_update(i, 1); vector left_to_node(N, -1); for (int i = 0; i < N; i++) left_to_node[i] = i; vector node_right(2*N, 0); for (int i = 0; i < N; i++) node_right[i] = i; for (int i = 0; i < N-1; i++) { int left_a = kth(A[i]); int node_a = left_to_node[left_a]; int left_b = node_right[node_a] + 1; int node_b = left_to_node[left_b]; int v = next_node++; lc[v] = node_a; rc[v] = node_b; par[node_a] = par[node_b] = v; node_left[v] = node_left[node_a]; node_right[v] = node_right[node_b]; bit_update(left_b, -1); left_to_node[left_a] = v; } root_node = left_to_node[0]; for (int i = 0; i < N; i++) dp[i][0] = dp[i][1] = dp[i][2] = 1; for (int v = N; v < 2*N-1; v++) combine(v); vector> dp_init(2*N-1); for (int v = 0; v < 2*N-1; v++) dp_init[v] = {dp[v][0], dp[v][1], dp[v][2]}; string chars = "PRS"; string results[3]; for (int target_idx = 0; target_idx < 3; target_idx++) { if (dp_init[root_node][target_idx] < K) { results[target_idx] = "-1"; continue; } for (int v = 0; v < 2*N-1; v++) for (int t = 0; t < 3; t++) dp[v][t] = dp_init[v][t]; ll rem = K; string ans(N, ' '); for (int leaf_j = 0; leaf_j < N; leaf_j++) { for (int ci = 0; ci < 3; ci++) { ll saved[3] = {dp[leaf_j][0], dp[leaf_j][1], dp[leaf_j][2]}; dp[leaf_j][0] = dp[leaf_j][1] = dp[leaf_j][2] = 0; dp[leaf_j][ci] = 1; update_up(leaf_j); ll cnt = dp[root_node][target_idx]; if (cnt >= rem) { ans[leaf_j] = chars[ci]; break; } else { rem -= cnt; for (int t = 0; t < 3; t++) dp[leaf_j][t] = saved[t]; update_up(leaf_j); } } } results[target_idx] = ans; } cout << results[1] << "\n" << results[0] << "\n" << results[2] << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int T; cin >> T; while (T--) solve(); return 0; }