#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <queue>
#include <deque>
#include <bitset>
#include <iterator>
#include <list>
#include <stack>
#include <map>
#include <set>
#include <functional>
#include <numeric>
#include <utility>
#include <limits>
#include <time.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <cstdio>
#include <cassert>

using namespace std;

// #define scd(t) scanf("%d",&t)
// #define scld(t) scanf("%ld",&t)
// #define sclld(t) scanf("%lld",&t)
// #define scc(t) scanf("%c",&t)
// #define scs(t) scanf("%s",&t)
// #define scf(t) scanf("%f",&t)
// #define sclf(t) scanf("%lf",&t)
#define FIO ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define FOR(i,j,k,n) for(int i=j;i<=k;i += n)
#define RFOR(i,j,k,n) for(int i=j;i>=k;i -= n)
#define REP(i,j) FOR(i,0,j,1)
#define RREP(i,j) RFOR(i,j,0,1)
#define all(cont) (cont).begin(), (cont).end()
#define rall(cont) (cont).rbegin(), (cont).rend()
#define FOREACH(it,l) for(auto it = l.begin();it != l.end();it++)
#define IN(A,B,C) assert(B <= A && A <= C)
#define MEM(a,b) memset(a,(b),sizeof(a))
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define endl "\n"
#define space " "
#define interact fflush(stdout)
#define present(cont,x) ((cont).find(x) != (cont).end())
#define ipresent(cont,x) (find(all(cont),x) != cont.end())
#define sz(cont) int((cont).size())
#define mem(cont) memset(cont,0,sizeof(cont))
#define pi 3.1415926535897932384626433832795

const int LOGN = 20;
const int MOD = 1e9 + 7;
const int MAXN = 2e5 + 5;
const int MAXA = 1e7 + 5;
const int inf = 1e9 + 1;
const int eps = 1e-9;
const long long int inf2 = 1e18 + 1;

typedef double ld;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef map<int,int> mpii;
typedef map<ll,ll> mpll;
// typedef unordered_map<int,int> umpii;
// typedef unordered_map<ll,ll> umpll;
typedef set<int> seti;
typedef set<ll> setl;
typedef multiset<int> mseti;
typedef multiset<ll> msetl;

// ll fact[405];		// factorial vector wrt mod
// ll inv[405];		// inverse factorial vector wrt mod
// ll choose[405][405]; // ncr wrt mod
// ll pow2[405];		// power of 2 wrt mod
// setl square;
// vl primes;
// ll A[MAXA];

// void allSquares()
// {
// 		for(int i = 1;i*i<=MAXN;i++)
// 			square.insert(i*i);
// 		return;
// }

// void FactorsSieve()
// {
// 	for(ll i = 0;i<MAXA;i++)
// 		A[i] = i;
// 	for(int i=2;i<MAXA;i++)
// 	{
// 		if(A[i] == i)
// 		{
// 			primes.pb(i);
// 			for(int j=2*i;j<MAXA;j += i)
// 				A[j] = i;
// 		}
// 	}
// 	return;
// }

// vl factorize(ll x)
// {
// 	vl factors;
// 	while(x > 1)
// 	{
// 		factors.pb(A[x]);
// 		x /= A[x];
// 	}
// 	return factors;
// }

// bool comparesecond(const pair<int,int> &a,const pair<int,int> &b)		// for comparing wrt to ss
// {
//     return (a.second < b.second);
// }

// ll fastexp(ll a,ll b,ll md)
// {
// 	ll res = 1;
// 	while(b)
// 	{
// 		if(b & 1)
// 			res = res*a%md;
// 		a = a*a%md;
// 		b >>= 1;
// 	}
// 	return res;
// }

// void Factorial()		// factorial function
// {
// 	fact[0] = 1;
// 	inv[0] = 1;
// 	for(int i=1;i<=n;i++)
// 	{
// 		fact[i] = (i*fact[i-1])%modulo;
// 		inv[i] = fastexp(fact[i],modulo - 2);
// 	}
// 	for(int i=0;i<=n;i++)
// 	{
// 		for(int j=0;j<=i;j++)
// 		{
// 			choose[i][j] = ((fact[i]*inv[j])%modulo * inv[i-j])%modulo;
// 		}
// 	}
// 	for(int i=0;i<=n;i++)
// 		pow2[i] = fastexp(2,i);
// 	return;
// }

int ask(int t,int i,int j,int x)
{
	cout << "? " << t << space << i + 1 << space << j + 1 << space << x << endl;
	int val;
	cin >> val;
	if(val == -1)
		exit(0);
	return val;
}

void solve()
{
	int n;
	cin >> n;
	vi p(n,-1);
	FOR(i,1,n-1,2)
	{
		int pos1 = i - 1;
		int pos2 = i;
		int val = ask(1,pos1,pos2,n-1);
		if(val == n - 1)
		{
			val = ask(1,pos2,pos1,n-1);
			if(val == n)
			{
				p[pos1] = val;
				p[pos2] = ask(2,pos2,pos1,1);
				continue;
			}
		}
		int get = ask(1,pos1,pos2,val-1);
		if(get == val)
		{
			p[pos2] = val;
			p[pos1] = ask(2,pos1,pos2,1);
		}
		if(get == val - 1)
		{
			p[pos1] = val;
			p[pos2] = ask(2,pos2,pos1,1);
		}
	}
	if(p.back() == -1)
	{
		vector<bool> us(n+1);
		REP(i,n-2)
			us[p[i]] = true;
		FOR(i,1,n,1)
		{
			if(!us[i])
				p[p.size() - 1] = i;
		}
	}
	cout << "! ";
	REP(i,n-1)
		cout << p[i] << space;
	cout << endl;
	return;
}

int main()
{
	// FIO;
	// freopen("input.txt","r",stdin);
	// freopen("output.txt","w",stdout);
	// FactorsSieve();
	// Factorial();
	// allSquares();
	// primefactors();
	ll cases = 1;
	cin >> cases;
	for(ll test = 1;test <= cases;test++)
	{
		// cout << "Case #" << test << ": ";
		solve();
	}
	return 0;
}	
