#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include<map>
#include<vector>
#include<string>
#include<math.h>
#include<time.h>
#include<set>
using namespace std;
using ll = long long;
typedef pair<ll, ll> P;
constexpr ll mod = 998244353;
ll n, m, k;
ll T;
ll dat[20000 + 5];
ll dk1[20000 + 5];
ll dk2[20000 + 5];
ll a[200000 + 5];
vector<ll> ans[4];
ll q1(ll x, ll i, ll j) {
    ll tmp;
    cout << "? 1 " << i << ' ' << j << ' ' << x << endl;
    cin >> tmp;

    return tmp;
}
ll q2(ll x, ll i, ll j) {
    ll tmp;
    cout << "? 2 " << i << ' ' << j << ' ' << x << endl;
    cin >> tmp;

    return tmp;
}
int main() {
    cin.sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> T;
    while (T--)
    {
        cin >> n;
        memset(dat, 0, sizeof(dat));
        memset(dk1, 0, sizeof(dk1));
        memset(dk2, 0, sizeof(dk2));





        ll pos1 = 0, pos2 = 0, posn = 0, posn2 = 0;
        for (int i = 1; i < n; i += 2) {
            ll k1 = q1(n - 1, i, i + 1);
            ll k2 = q2(1, i, i + 1);
            if (k2 == 1) {
                dat[i] = 1, pos1 = i;

            }
            if (k2 == 2) {
                ll tmp;
                tmp = q2(1, i + 1, i);
                if (tmp == 1)dat[i + 1] = 1, pos1 = i + 1;

            }
            if (k1 == n) {
                dat[i + 1] = n, posn = i + 1;

            }
            if (k1 == n - 1) {
                ll tmp;

                tmp = q1(n - 1, i + 1, i);
                if (tmp == n)dat[i] = n, posn = i;

            }
            dk1[i] = k1;
            dk2[i] = k2;
        }
        if (pos1 == 0)dat[n] = 1, pos1 = n;

        if (posn == 0)dat[n] = n, posn = n;

        for (int i = 1; i < n; i += 2) {
            if (dat[i] == 0 && dat[i + 1] == 0) {
                ll tmp = q1(dk1[i], pos1, i);
                dat[i] = tmp;
                if (tmp == dk1[i])dat[i + 1] = dk2[i];
                else dat[i + 1] = dk1[i];
            }
            else if (dat[i] && dat[i + 1])continue;
            else {
                ll f;
                if (dat[i])f = i;
                else f = i + 1;
                if (dat[f] == 1)
                    dat[2 * i + 1 - f] = dk1[i];
                else if (dat[f] == n)dat[2 * i + 1 - f] = dk2[i];
            }
        }
        if (dat[n] == 0) {
            ll sum = 0;
            for (int i = 1; i < n; i++)sum += dat[i];
            dat[n] = (1 + n) * n / 2 - sum;
        }
        cout << "! ";
        for (int i = 1; i <= n; i++)cout << dat[i] << ' ';
        cout << endl;
    }

}