#include using namespace std; using ll = long long; static const ll ceiling = (ll)4e18; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while(T--){ int N; ll K; cin >> N >> K; vector A(N-1); for(int i=0;i> A[i]; vector current; current.reserve(2*N); for(int i=0;i left(2*N+5,-1), right(2*N+5,-1); vector> dp(2*N+5); int node_id = N; for(int i=0;i calc = [&](int v){ if(v < N){ dp[v] = {1,1,1}; return; } calc(left[v]); calc(right[v]); array res = {0,0,0}; char C[3] = {'R','P','S'}; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ char w = decide(C[i], C[j]); int id = (w=='R'?0:w=='P'?1:2); res[id] += dp[left[v]][i] * dp[right[v]][j]; if(res[id] > ceiling) res[id] = ceiling; } } dp[v] = res; }; calc(root); auto make = [&](int target)->string{ function build = [&](int v,ll k)->string{ if(v < N){ string base = "RPS"; for(char c: base){ if(k==1) return string(1,c); k--; } } char order[3] = {'R','P','S'}; for(char pick : order){ ll ways = 0; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ char w = decide("RPS"[i], "RPS"[j]); int id = (w=='R'?0:w=='P'?1:2); if(id == target) ways += dp[left[v]][i] * dp[right[v]][j]; } } if(k > ways){ k -= ways; } else { return build(left[v],k) + build(right[v],k); } } return "-1"; }; if(dp[root][target] < K) return string("-1"); return build(root,K); }; for(int i=0;i<3;i++){ cout << make(i) << "\n"; } } }