/*
	Coded by Apojacsleam
*/
#include<bits/stdc++.h>
using namespace std;
int T,n,a[10010][3],b[10010][3],ans[10010];
int query(int type,int i,int j,int x)
{
	int cnt;
	printf("? %d %d %d %d\n",type,i,j,x);
	fflush(stdout);
	scanf("%d",&cnt);
	return cnt;
}
int main()
{
	int cnt,tot;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		if(n==3)
		{
			a[1][1]=a[2][1]=max(query(1,1,2,2),query(1,2,1,2));
			a[1][2]=a[2][2]=min(query(2,1,2,1),query(2,2,1,1));
			a[3][1]=max(query(1,2,3,2),query(1,3,2,2));
			a[3][2]=min(query(2,3,2,1),query(2,2,3,1)); 
			for(int j=1;j<=2;j++)
			  for(int k=1;k<=2;k++)
				if(a[2][j]==a[3][k])
				{
				    ans[2]=a[2][j];
				}
			ans[3]=a[3][1]^a[3][2]^ans[2];
			ans[1]=a[1][1]^a[1][2]^ans[2];
		}
		else
		{
			for(int i=1;i+1<=n;i+=2)
			{
				cnt=query(1,i,i+1,n-1);tot=0;
				if(cnt>=n-1)
				{
					printf("? 1 %d %d %d\n",i+1,i,n-1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				a[i][1]=max(cnt,tot);
				a[i+1][1]=max(cnt,tot);
				printf("? 2 %d %d %d\n",i,i+1,1);
				fflush(stdout);
				scanf("%d",&cnt);tot=n+1;
				if(cnt<=2)
				{
					printf("? 2 %d %d %d\n",i+1,i,1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				a[i][2]=min(cnt,tot);
				a[i+1][2]=min(cnt,tot);
			}
			for(int i=2;i+1<=n;i+=4)
			{
				printf("? 1 %d %d %d\n",i,i+1,n-1);
				fflush(stdout);
				scanf("%d",&cnt);tot=0;
				if(cnt>=n-1)
				{
					printf("? 1 %d %d %d\n",i+1,i,n-1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				b[i][1]=max(cnt,tot);
				b[i+1][1]=max(cnt,tot);
				printf("? 2 %d %d %d\n",i,i+1,1);
				fflush(stdout);
				scanf("%d",&cnt);tot=n+1;
				if(cnt<=2)
				{
					printf("? 2 %d %d %d\n",i+1,i,1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				b[i][2]=min(cnt,tot);
				b[i+1][2]=min(cnt,tot);
			}
			for(int i=1;i<=n;i+=4)
			{
				for(int j=1;j<=2;j++)
				  for(int k=1;k<=2;k++)
				    if(a[i+1][j]==b[i+1][k])
				    {
				    	ans[i+1]=a[i+1][j];
					}
				ans[i]=a[i][1]^a[i][2]^ans[i+1];
				ans[i+2]=b[i+2][1]^b[i+2][2]^ans[i+1];
				ans[i+3]=a[i+3][1]^a[i+3][2]^ans[i+2];
			}
			for(int i=n-3;i+1<=n;i+=2)
			{
				printf("? 1 %d %d %d\n",i,i+1,n-1);
				fflush(stdout);
				scanf("%d",&cnt);tot=0;
				if(cnt>=n-1)
				{
					printf("? 1 %d %d %d\n",i+1,i,n-1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				a[i][1]=max(cnt,tot);
				a[i+1][1]=max(cnt,tot);
				printf("? 2 %d %d %d\n",i,i+1,1);
				fflush(stdout);
				scanf("%d",&cnt);tot=n+1;
				if(cnt<=2)
				{
					printf("? 2 %d %d %d\n",i+1,i,1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				a[i][2]=min(cnt,tot);
				a[i+1][2]=min(cnt,tot);
			}
			for(int i=n-2;i+1<=n;i+=4)
			{
				printf("? 1 %d %d %d\n",i,i+1,n-1);
				fflush(stdout);
				scanf("%d",&cnt);tot=0;
				if(cnt>=n-1)
				{
					printf("? 1 %d %d %d\n",i+1,i,n-1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				b[i][1]=max(cnt,tot);
				b[i+1][1]=max(cnt,tot);
				printf("? 2 %d %d %d\n",i,i+1,1);
				fflush(stdout);
				scanf("%d",&cnt);tot=n+1;
				if(cnt<=2)
				{
					printf("? 2 %d %d %d\n",i+1,i,1);
					fflush(stdout);
					scanf("%d",&tot);
				}
				b[i][2]=min(cnt,tot);
				b[i+1][2]=min(cnt,tot);
			}
			for(int i=n-3;i<=n;i+=4)
			{
				for(int j=1;j<=2;j++)
				  for(int k=1;k<=2;k++)
				    if(a[i+1][j]==b[i+1][k])
				    {
				    	ans[i+1]=a[i+1][j];
					}
				ans[i]=a[i][1]^a[i][2]^ans[i+1];
				ans[i+2]=b[i+2][1]^b[i+2][2]^ans[i+1];
				ans[i+3]=a[i+3][1]^a[i+3][2]^ans[i+2];
			}
		}
		printf("! ");
		for(int i=1;i<=n;i++)
		  printf("%d ",ans[i]);
		printf("\n");
		fflush(stdout);
	}
	return 0;
}