#include using namespace std; #define ll long long const ll maxn=20005; ll p[maxn+5],nxt[maxn+5],deg[maxn+5],ans[maxn+5],bad[maxn+5],pos[maxn+5]; bool ins[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(not ins[val])return; ins[val]=false; ll idx=pos[val]; ll last=s.back(); s[idx]=last; pos[last]=idx; s.pop_back(); } int main(){ ll t,n,i,j,k,idx1,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,ins[i]=true,bad[i]=0,nxt[i]=0,deg[i]=0,ans[i]=0; while(s.size()>1){ i=s[rand()%s.size()]; if(s.size()>2){ j=s[rand()%s.size()]; while(i==j)j=s[rand()%s.size()]; }else{ j=rand()%n+1; while(i==j)j=rand()%n+1; } k=ask(i,j); if(k==-1){ bad[i]++; if(ins[j])bad[j]++; if(bad[i]>=2)del(i); if(ins[j] and bad[j]>=2)del(j); }else{ del(k); } } idx1=s[0]; ans[idx1]=1; for(i=1;i<=n;i++){ if(i==idx1)continue; k=ask(idx1,i); if(k!=-1)nxt[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){ ans[cur]=cnt++; cur=nxt[cur]; } printf("2"); for(i=1;i<=n;i++)printf(" %lld",ans[i]); printf("\n"); fflush(stdout); } return 0; }