#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<string>
#include<vector>
#include <random>       // std::default_random_engine
using namespace std;
typedef long long ll;
int n;
vector<int> testvec;
bool debug = false;
int ask_min(int i, int j)
{
	cout << "? 2 " << i << " " << j << " 1\n";
	cout.flush();
	if (debug)
	{
		int v = min(max(1, testvec[i]), max(2, testvec[j]));
		cout << "  " << v << endl;
		return v;
	}
	int ret;
	cin >> ret;
	return ret;
}
int ask_max(int i, int j)
{
	cout << "? 1 " << i << " " << j << " "<<n-1<<"\n";
	cout.flush();
	if (debug)
	{
		int v = max(min(n-1, testvec[i]), min(n, testvec[j]));
		cout << "  " << v << endl;
		return v;
	}
	int ret;
	cin >> ret;
	return ret;
}
pair<int, int> get_minmax(int i, int j)
{
	return {
		min(ask_min(i,j), ask_min(j,i)),
		max(ask_max(i,j), ask_max(j,i))
	};
}
void solve()
{
	cin >> n;
	testvec = vector<int>(n + 1, 0);
	for (int i = 1; i <= n; i++) testvec[i] = i;
	shuffle(testvec.begin()+1, testvec.end(), default_random_engine(0));
	pair<int, int> p12 = get_minmax(1, 2);
	pair<int, int> p23 = get_minmax(2, 3);
	pair<int, int> p13 = get_minmax(1, 3);
	vector<int> a(n + 1, 0);
	if (p12.first == p13.first) a[1] = p12.first;
	if (p12.first == p23.first) a[2] = p12.first;
	if (p13.first == p23.first) a[3] = p13.first;
	if (p12.second == p13.second) a[1] = p12.second;
	if (p12.second == p23.second) a[2] = p12.second;
	if (p13.second == p23.second) a[3] = p13.second;
	if (a[1] == 0) a[1] = (p12.first + p12.second + p13.first + p13.second - a[2] - a[3]) / 2;
	if (a[2] == 0) a[2] = (p12.first + p12.second + p23.first + p23.second - a[1] - a[3]) / 2;
	if (a[3] == 0) a[3] = (p13.first + p13.second + p23.first + p23.second - a[1] - a[2]) / 2;
	int minx=n+1, maxx=0, mini, maxi;
	for (int i = 1; i <= 3; i++)
	{
		if (minx > a[i]) { minx = a[i]; mini = i; }
		if (maxx < a[i]) { maxx = a[i]; maxi = i; }
	}
	int pivot; bool maxmode;
	if (minx - 1 <= n - maxx) { pivot = mini; maxmode = false; }
	else { pivot = maxi; maxmode = true; }
	for (int i = 4; i <= n; i++)
	{
		if(maxmode) // has p[pivot]>=n/2
		{
			int v = ask_min(i, pivot);
			if (v >= a[pivot])
			{
				a[i] = ask_max(pivot, i);
				pivot = i;
			}
			else a[i] = v;
		}
		else
		{
			int v = ask_max(pivot, i);
			if (v <= a[pivot])
			{
				a[i] = ask_min(i, pivot);
				pivot = i;
			}
			else a[i] = v;
		}
	}
	if (debug)
	{
		cout << "*";
		for (int i = 1; i <= n; i++) cout << " " << testvec[i];
		cout << endl;
	}
	cout << "!";
	for (int i = 1; i <= n; i++) cout << " " << a[i];
	cout << endl;
	cout.flush();
}
int main()
{
	int t;
	for(scanf("%d", &t);t--;)
	{
		solve();
	}
	return 0;
}
