#include using namespace std; #define ll long long const ll maxn=20005; ll p[maxn+5],q[maxn+5],deg[maxn+5],pos[maxn+5]; vector s; ll ask(ll i,ll j){ printf("1 %lld %lld\n",i,j); fflush(stdout); ll res; scanf("%lld",&res); return res; } void del(ll val){ if(pos[val]==-1)return; ll last=s.back(); ll idx=pos[val]; s[idx]=last; pos[last]=idx; s.pop_back(); pos[val]=-1; } int main(){ ll t,n,i,j,k,zc,zc1,zc2,idx1,idxN,cur,cnt; srand(time(0)); scanf("%lld",&t); while(t--){ scanf("%lld",&n); s.clear(); for(i=1;i<=n;i++)s.push_back(i),pos[i]=i-1,deg[i]=0,p[i]=0,q[i]=0; while(s.size()>1){ zc1=s[rand()%s.size()]; zc2=rand()%n+1; while(zc1==zc2)zc2=rand()%n+1; k=ask(zc1,zc2); if(k!=-1){ del(k); } else{ zc=rand()%n+1; while(zc==zc1 or zc==zc2)zc=rand()%n+1; k=ask(zc1,zc); if(k==-1)del(zc1); else del(k); } } idx1=s[0]; q[idx1]=1; idxN=-1; for(i=1;i<=n;i++){ if(i==idx1)continue; k=ask(idx1,i); if(k==-1)idxN=i; else{ p[i]=k; deg[k]++; } } cur=-1; for(i=1;i<=n;i++){ if(i!=idx1 and deg[i]==0){ cur=i; break; } } cnt=2; while(cur!=0){ q[cur]=cnt++; cur=p[cur]; } printf("2"); for(i=1;i<=n;i++)printf(" %lld",q[i]); printf("\n"); fflush(stdout); } return 0; }