#include using namespace std; using ll=long long; #include #include int op(int x,int y){ return x+y; } int e(){ return 0; } array solve(int n,ll k,vector a){ k--; if(n<61&&(1ll<<(n-1))<=k)return{"-1","-1","-1"}; vector> graph(2*n-1,{-1,-1}); { atcoder::dsu uf(2*n-1); atcoder::segtree seg(n); for(int i=0;i p(2*n-1); iota(p.begin(),p.end(),0); for(int i=0;iint{ return x<=a[i]; }; int l=seg.max_right(0,f); a[i]++; int r=seg.max_right(0,f); //cout< arr,string& ans)->int{ if(v>=n-1){ if(cnt>=61){ ans.push_back('P'); return 0; } ll mcur=cur>>cnt; if(mcur>=arr[0]+arr[1]){ cur-=(arr[0]+arr[1])<=arr[0]){ cur-=arr[0]< narr; cnt--; narr[0]=min(k+1,arr[0]+arr[2]); narr[1]=min(k+1,arr[1]+arr[0]); narr[2]=min(k+1,arr[2]+arr[1]); int c=rec(rec,graph[v][0],narr,ans); if(c==0){ narr={0,arr[0],arr[2]}; }else if(c==1){ narr={arr[0],0,arr[1]}; }else{ narr={arr[2],arr[1],0}; } int d=rec(rec,graph[v][1],narr,ans); return (4-c-d)%3; }; array res{"","",""}; rec(rec,0,{0,1,0},res[0]); cur=k;cnt=n-1; rec(rec,0,{1,0,0},res[1]); cur=k;cnt=n-1; rec(rec,0,{0,0,1},res[2]); return res; } array naive(int n,ll k,vector a){ vector> res(3); auto tostring=[n](vector s)->string{ string res; for(int i=0;i s)->int{ for(int i=0;i s)->void{ if(d==n){ int r=judge(s); if(r!=-1)res[r].push_back(tostring(s)); return; } for(int i=0;i<3;i++){ s.push_back(i); rec(rec,d+1,s); s.pop_back(); } return; }; rec(rec,0,{}); array ans; for(int i=0;i<3;i++){ ranges::sort(res[i]); if(res[i].size()>ttt; while(ttt--){ int n; ll k; cin>>n>>k; vector a(n-1); for(int i=0;i>a[i],a[i]--; auto[s1,s2,s3]=solve(n,k,a); cout<