        #include<bits/stdc++.h>
#define loop(i, n) for(int i = 0; i < n; i++)
#define pb          push_back
#define ll          long long int
#define vi          vector<int>
#define pi          pair<int, int>
#define W(t)        int t; cin >> t; while(t--)
#define FIO         ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ff          first
#define ss          second
#define rep(i, a, b)for(ll i = a; i <= b; i++)
#define dep(i, a, b)for(ll i = a; i >= b; i--) 
#define all(x)      x.begin(), x.end()
#define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
#define PI                3.141592653589793238
using namespace std;
const ll mod = (ll)(998244353);
const ll mod2 = (ll)1e9+7;
ll test = 1;
vector<ll> read(int n){
    
    vector<ll> v(n);

    loop(i, n)
        cin >> v[i];
    return v;
}
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }
    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
ll query(ll t, ll i, ll j, ll x){

    cout << "? " << t << " " << i << " " << j << " " << x << endl;

    ll m;

    cin >> m;

    return m;

}

ll n;
int findn(){

    for(int i = 1; i < n; i+=2){

        int ans = query(1, i, i+1, n-1);

        if(ans == n){
            return i+1;
        }

        if(ans == n-1){
            ans = query(1, i+1, i, n-1);
            if(ans == n){
                return i;
            }
        }
    }

 /*   For odd n*/

    return n;
}
std::vector<ll> res;
void findPerm(int idx){

    rep(i, 1, n){
        if(i == idx)continue;
        res[i] = query(2, i, idx, 1);
    }
}
void solve(){
    ll i, j, k, m,cnt = 0, ans = 0, sum = 0;

    cin  >> n;

/*    Step 1 Find the the position of n Using query 1 
*/
/*
    Step 2 with help of idx of n find the permutation using query 2*/

    int idxn = findn();

    res.clear();
    res.resize(n+1);

    res[idxn] = n;

    findPerm(idxn);

    cout << "! ";

    rep(i, 1, n){
        cout << res[i] << " ";
    }
    cout << endl;

    test++;
}

int main(){
    FIO
    
    #ifndef ONLINE_JUDGE
    freopen("C:/Codeforces/input.txt", "r", stdin);
    freopen("C:/Codeforces/output.txt", "w", stdout);
    #endif
    ll i = 1;
    W(t)
    solve();
    
    return 0;
    
}