#include <bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)
#define all(vec) vec.begin(),vec.end()
#ifdef LOCAL
#include "C:\Users\15328\Desktop\isaunoya.hpp"
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
using namespace std;
mt19937_64 rnd(time(nullptr));
int query(int a, int b, int c) {
	cout << "? ";
	cout << a + 1 << " " << b + 1 << " " << c + 1 << endl;
	int res;
	cin >> res;
	return res;
}
int main() {
	cin.tie(nullptr)->sync_with_stdio(false);
	int tt;
	cin >> tt;
	while (tt--) {
		int n;
		cin >> n;
		int a, b, c;
		while (true) {
			a = rnd() % n;
			b = rnd() % n;
			c = rnd() % n;
			if (a == b || a == c || b == c) {
				continue;
			} else if (query(a, b, c) < n / 6) {
				break;
			}
		}
		vector<int> dist(n);
		for (int i = 0; i < n; i++) {
			if (i == a || i == b) {
				dist[i] = -1;
			} else {
				dist[i] = query(a, b, i);
			}
		}
		vector<int> ord(n);
		iota(begin(ord), end(ord), 0);
		sort(begin(ord), end(ord), [&](int x, int y) {
			return dist[x] > dist[y];
		});
		vector<vector<int>> h;
		int st = 0;
		for (int j = 0; j < 3; j++) {
			vector<int> tmp;
			int d = st;
			while (d < n && dist[ord[d]] == dist[ord[st]]) {
				tmp.emplace_back(ord[d++]);
			}
			h.emplace_back(tmp);
			st = d;
		}
		int r0 = -1, r1 = -1;
		for (auto x : h[0]) {
			for (auto y : h[1]) {
				for (auto z : h[2]) {
					if (query(x, y, z) == 1) {
						tie(r0, r1) = make_tuple(x, y);
					}
				}
			}
		}
		vector<int> p(n, -1);
		for (int i = 0; i < n; i++) {
			if (i == r0) {
				p[i] = 0;
			} else if (i == r1) {
				p[i] = 1;
			} else {
				p[i] = 1 + query(r0, r1, i);
			}
		}
		if (p[0] > p[1]) {
			for (auto &x: p) {
				x = n - 1 - x;
			}
		}
		cout << "! ";
		for (int i = 0; i < n; i++) {
			if (i > 0) {
				cout << " ";
			}
			cout << p[i] + 1;
		}
		cout << endl;
		int ans;
		cin >> ans;
	}
}
### Prompt

Generate a Cpp solution to the following problem:

This is an interactive problem.

There is a secret permutation p (1-indexed) of numbers from 1 to n. More formally, for 1 ≤ i ≤ n, 1 ≤ p[i] ≤ n and for 1 ≤ i < j ≤ n, p[i] ≠ p[j]. It is known that p[1]<p[2].

In 1 query, you give 3 distinct integers a,b,c (1 ≤ a,b,c ≤ n), and receive the median of \{|p[a]-p[b]|,|p[b]-p[c]|,|p[a]-p[c]|\}.

In this case, the median is the 2-nd element (1-indexed) of the sequence when sorted in non-decreasing order. The median of \{4,6,2\} is 4 and the median of \{0,123,33\} is 33.

Can you find the secret permutation in not more than 2n+420 queries?

Note: the grader is not adaptive: the permutation is fixed before any queries are made.

Input

The first line of input contains a single integer t (1 ≤ t ≤ 1000) — the number of testcases.

The first line of each testcase consists of a single integer n (20 ≤ n ≤ 100000) — the length of the secret permutation.

It is guaranteed that the sum of n over all test cases does not exceed 100000.

Interaction

For each testcase, you begin the interaction by reading n.

To perform a query, output "? a b c" where a,b,c is the 3 indices you want to use for the query.

Numbers have to satisfy 1 ≤ a,b,c ≤ n and a ≠ b,b ≠ c,a ≠ c.

For each query, you will receive a single integer x: the median of \{|p[a]-p[b]|,|p[b]-p[c]|,|p[a]-p[c]|\}.

In case your query is invalid or you asked more than 2n+420 queries, the interactor will print "−1" and will finish interaction. You will receive Wrong answer verdict. Make sure to exit immediately to avoid getting other verdicts.

When you have determined the secret permutation, output "! p[1] p[2] ... p[n]". If the secret permutation is correct, the interactor will print "1". Otherwise, the interactor will print "-1" and will finish interaction. You will receive Wrong answer verdict. Make sure to exit immediately to avoid getting other verdicts.

After printing a query do not forget to output the end of line and flush the output. Otherwise, you will get Idleness limit exceeded verdict.

To do this, use:

  * fflush(stdout) or cout.flush() in C++;
  * System.out.flush() in Java;
  * flush(output) in Pascal;
  * stdout.flush() in Python;
  * see documentation for other languages.



Hacks:

To hack, use the following format of test:

The first line should contain a single integer t (1 ≤ t ≤ 1000) — the number of testcases.

The first line of each testcase should contain a single integer n (20 ≤ n ≤ 100000) — the length of the secret permutation.

The following line of should contain n integers p[1],p[2],p[3],…,p[n]. p[1]<p[2] and p must be a permutation of integers from 1 to n.

You must ensure that the sum of n over all testcases does not exceed 100000.

Example

Input


1
20

6

9

1

Output




? 1 5 2

? 20 19 2

! 9 10 19 7 16 18 11 14 15 6 20 8 17 4 5 3 12 2 13 1

Note

The secret permutation is \{9,10,19,7,16,18,11,14,15,6,20,8,17,4,5,3,12,2,13,1\}.

For the first query, the values of (a,b,c) is (1,5,2). Since p[1]=9, p[5]=16 and p[2]=10. The return value is the median of \{|9-16|,|16-10|,|9-10|\} which is 6.

For the second query, the values of (a,b,c) is (20,19,2). Since p[20]=1, p[19]=13 and p[2]=10. The return value is the median of \{|1-13|,|13-10|,|1-10|\} which is 9.

By some miracle, we have figured out that the secret permutation is \{9,10,19,7,16,18,11,14,15,6,20,8,17,4,5,3,12,2,13,1\}. We output it and receive 1 from the interactor, meaning that we have guessed the secret permutation correctly.

### Response

```cpp
#include <bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define per(i,x,y) for(int i=x;i>=y;i--)
#define all(vec) vec.begin(),vec.end()
#ifdef LOCAL
#include "C:\Users\15328\Desktop\isaunoya.hpp"
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
using namespace std;
mt19937_64 rnd(time(nullptr));
int query(int a, int b, int c) {
	cout << "? ";
	cout << a + 1 << " " << b + 1 << " " << c + 1 << endl;
	int res;
	cin >> res;
	return res;
}
int main() {
	cin.tie(nullptr)->sync_with_stdio(false);
	int tt;
	cin >> tt;
	while (tt--) {
		int n;
		cin >> n;
		int a, b, c;
		while (true) {
			a = rnd() % n;
			b = rnd() % n;
			c = rnd() % n;
			if (a == b || a == c || b == c) {
				continue;
			} else if (query(a, b, c) < n / 6) {
				break;
			}
		}
		vector<int> dist(n);
		for (int i = 0; i < n; i++) {
			if (i == a || i == b) {
				dist[i] = -1;
			} else {
				dist[i] = query(a, b, i);
			}
		}
		vector<int> ord(n);
		iota(begin(ord), end(ord), 0);
		sort(begin(ord), end(ord), [&](int x, int y) {
			return dist[x] > dist[y];
		});
		vector<vector<int>> h;
		int st = 0;
		for (int j = 0; j < 3; j++) {
			vector<int> tmp;
			int d = st;
			while (d < n && dist[ord[d]] == dist[ord[st]]) {
				tmp.emplace_back(ord[d++]);
			}
			h.emplace_back(tmp);
			st = d;
		}
		int r0 = -1, r1 = -1;
		for (auto x : h[0]) {
			for (auto y : h[1]) {
				for (auto z : h[2]) {
					if (query(x, y, z) == 1) {
						tie(r0, r1) = make_tuple(x, y);
					}
				}
			}
		}
		vector<int> p(n, -1);
		for (int i = 0; i < n; i++) {
			if (i == r0) {
				p[i] = 0;
			} else if (i == r1) {
				p[i] = 1;
			} else {
				p[i] = 1 + query(r0, r1, i);
			}
		}
		if (p[0] > p[1]) {
			for (auto &x: p) {
				x = n - 1 - x;
			}
		}
		cout << "! ";
		for (int i = 0; i < n; i++) {
			if (i > 0) {
				cout << " ";
			}
			cout << p[i] + 1;
		}
		cout << endl;
		int ans;
		cin >> ans;
	}
}
```