#include using namespace std; typedef long long ll; const ll BIG = (ll)2e18; ll mc(ll a, ll b) { if (a == 0 || b == 0) return 0; if (a > BIG / b) return BIG; return a * b; } ll ac(ll a, ll b) { if (a > BIG - b) return BIG; return a + b; } const int bt[3] = {1, 2, 0}; const int wb[3] = {2, 0, 1}; int fw[200005]; int fn; void fu(int i, int v) { for (; i <= fn; i += i & -i) fw[i] += v; } int fk(int k, int L) { int p = 0; for (int s = L; s >= 0; s--) { int j = p + (1 << s); if (j <= fn && fw[j] < k) { p = j; k -= fw[j]; } } return p + 1; } int lc[400005], rc[400005]; int at[200005]; ll cn[400005][3]; struct F { int v, p; ll W[3]; ll K; int c; }; int as_[200005]; int main() { int T; scanf("%d", &T); while (T--) { int n; ll K; scanf("%d %lld", &n, &K); int nd = 2 * n - 1; for (int i = 1; i <= nd; i++) { lc[i] = 0; rc[i] = 0; } vector A(n); for (int i = 1; i < n; i++) scanf("%d", &A[i]); fn = n; for (int i = 0; i <= n + 1; i++) fw[i] = 0; for (int i = 1; i <= n; i++) fu(i, 1); int L = 0; while ((1 << (L + 1)) <= n) L++; for (int i = 1; i <= n; i++) at[i] = i; for (int i = 1; i < n; i++) { int a = fk(A[i], L); int b = fk(A[i] + 1, L); int x = n + i; lc[x] = at[a]; rc[x] = at[b]; at[a] = x; fu(b, -1); } int rt = 2 * n - 1; vector ord; ord.reserve(nd); { vector> st; st.reserve(nd); st.push_back({rt, 0}); while (!st.empty()) { auto &t = st.back(); if (t.second == 0) { t.second = 1; int v = t.first; if (lc[v]) { st.push_back({rc[v], 0}); st.push_back({lc[v], 0}); } } else { ord.push_back(t.first); st.pop_back(); } } } for (int v : ord) { if (!lc[v]) { cn[v][0] = cn[v][1] = cn[v][2] = 1; } else { int l = lc[v], r = rc[v]; for (int c = 0; c < 3; c++) { ll a = mc(cn[l][c], cn[r][bt[c]]); ll b = mc(cn[l][bt[c]], cn[r][c]); cn[v][c] = ac(a, b); } } } string ans[3]; for (int g = 0; g < 3; g++) { if (cn[rt][g] < K) { ans[g] = "-1"; continue; } for (int i = 1; i <= n; i++) as_[i] = 0; vector st; st.reserve(nd + 8); F z; z.v = rt; z.p = 0; z.W[0] = z.W[1] = z.W[2] = 0; z.W[g] = 1; z.K = K; z.c = -1; st.push_back(z); int rcv = -1; ll rk = 0; while (!st.empty()) { F &f = st.back(); int v = f.v; if (!lc[v]) { ll k = f.K; int pk = -1; for (int c = 0; c < 3; c++) { if (f.W[c] >= k) { pk = c; break; } k -= f.W[c]; } as_[v] = pk; rcv = pk; rk = k; st.pop_back(); } else if (f.p == 0) { int l = lc[v], r = rc[v]; ll W[3]; for (int c = 0; c < 3; c++) { ll a = mc(f.W[c], cn[r][bt[c]]); ll b = mc(f.W[wb[c]], cn[r][wb[c]]); W[c] = ac(a, b); } f.p = 1; F ch; ch.v = l; ch.p = 0; ch.W[0] = W[0]; ch.W[1] = W[1]; ch.W[2] = W[2]; ch.K = f.K; ch.c = -1; st.push_back(ch); } else if (f.p == 1) { f.c = rcv; int r = rc[v]; int cl = f.c; ll W[3] = {0, 0, 0}; W[bt[cl]] = f.W[cl]; W[wb[cl]] = f.W[wb[cl]]; f.p = 2; F ch; ch.v = r; ch.p = 0; ch.W[0] = W[0]; ch.W[1] = W[1]; ch.W[2] = W[2]; ch.K = rk; ch.c = -1; st.push_back(ch); } else { int cr = rcv; int cl = f.c; int cv; if (cr == bt[cl]) cv = cl; else cv = wb[cl]; rcv = cv; st.pop_back(); } } string s; s.resize(n); for (int i = 1; i <= n; i++) s[i - 1] = "PRS"[as_[i]]; ans[g] = s; } printf("%s\n%s\n%s\n", ans[1].c_str(), ans[0].c_str(), ans[2].c_str()); } return 0; }