Problem: This is an interactive problem.

You are the head coach of a chess club. The club has 2n players, each player has some strength which can be represented by a number, and all those numbers are distinct. The strengths of the players are not known to you.

You need to select n players who would represent your club in the upcoming championship. Naturally, you want to select n players with the highest strengths.

You can organize matches between the players to do that. In every match, you pick two players, they play some games, and you learn which one of the two has higher strength. You can wait for the outcome of a match before deciding who will participate in the next one.

However, you do not want to know exactly how those n players compare between themselves, as that would make the championship itself less intriguing. More formally, you must reach a state where there is exactly one way to choose n players with the highest strengths that is consistent with the outcomes of the matches you organized, but there must be at least two possible orderings of those n players by strength that are consistent with the outcomes of the matches you organized.

Interaction

Your program has to process multiple test cases in one run. First, it should read the integer t (t ≥ 1) — the number of test cases. Then, it should process the test cases one by one.

In each test case, your program should start by reading the integer n (3 ≤ n ≤ 100) — the number of players to select out of 2n players. The sum of squares of the values of n over all test cases does not exceed 10 000.

Then your program can organize matches zero or more times. To organize a match, your program should print a match description formatted as ? i j — a question mark followed by two distinct numbers of players participating in the match. The players are numbered from 1 to 2n, inclusive. Remember to flush the output after printing the match description. Then your program should read the match outcome — it will be either the greater-than character (>), if the first player in the match description has higher strength, or the less-than character (<), if the second player in the match description has higher strength.

Your program can organize at most 4n^2 matches. After it is done organizing matches, it should print the exclamation mark (!) and continue to the next test case, or exit gracefully if this was the last test case. Remember to flush the output after printing the exclamation mark.

There must be exactly one way to choose n players with the highest strength that is consistent with the outcomes of the matches you organized, but there must be at least two possible orderings of those n players by their strength that are consistent with the outcomes of the matches you organized.

The judging program picks some distinct numbers as the strengths of all players before your program starts organizing matches and uses them to answer the requests.

Example

Input


2
3

&gt;

&lt;

&gt;

&lt;

&gt;

&gt;

3

&lt;

&lt;

&lt;

&gt;

&gt;


Output




? 1 3

? 4 2

? 4 5

? 6 5

? 3 4

? 5 6

!

? 3 4

? 4 2

? 5 3

? 6 4

? 3 1

!

Note

In the example, the players in the first test case are sorted by strength in decreasing order. From the matches in the example output, we can deduce that players 1, 2, and 3 have the highest strength, but we do not know how the player 1 compares to the player 2.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
using vi = std::vector<int>;
using vvi = std::vector<vi>;
using pii = std::pair<int, int>;
using vpii = std::vector<pii>;
struct Jury {
  vi perm;
  vpii edges;
  int getN() { return ((int)(perm).size() - 1) / 2; }
  Jury(int n) : perm(1 + 2 * n, 0) {
    for (int i = 1; i <= 2 * n; i++) perm[i] = i;
  }
  char ask(int a, int b) {
    if (perm[a] < perm[b]) {
      edges.emplace_back(a, b);
      return '<';
    }
    assert(perm[a] > perm[b]);
    edges.emplace_back(b, a);
    return '>';
  }
  bool next() {
    edges.clear();
    return std::next_permutation(perm.begin() + 1, perm.end());
  }
  bool check() {
    int n = ((int)(perm).size() - 1) / 2;
    vi a{0}, ind{0};
    for (int i = n + 1; i <= 2 * n; i++) {
      a.push_back(i);
    }
    for (int i = 1; i <= 2 * n; i++) {
      if (perm[i] > n) ind.push_back(i);
    }
    std::sort((a).begin(), (a).end());
    vvi answers;
    vi backup = perm;
    do {
      vi save = perm;
      for (int i = 1; i <= n; i++) {
        perm[ind[i]] = a[i];
      }
      bool ok = true;
      for (auto &[a, b] : edges) {
        ok &= perm[a] < perm[b];
      }
      if (ok) {
        answers.push_back(perm);
      }
      perm = save;
    } while (std::next_permutation(a.begin() + 1, a.end()));
    perm = backup;
    if ((int)(answers).size() == 1) {
      std::cout << "Wrong Answer on testcase";
      for (int i = 1; i <= 2 * n; i++) {
        std::cout << ' ' << perm[i];
      }
      std::cout << std::endl;
      std::cout << "order of indexes";
      for (int i = 1; i <= n; i++) {
        std::cout << ' ' << ind[i];
      }
      std::cout << " is strictly defined!" << std::endl;
      std::cout << "you determined that these condition holds:" << std::endl;
      perm = answers.back();
      for (auto &[a, b] : edges) {
        std::cout << a << '<' << b << "( means p[" << a << "]=" << perm[a]
                  << " < "
                  << "p[" << b << "] = " << perm[b] << std::endl;
      }
      return false;
    } else {
      assert((int)(answers).size() > 1);
      for (int i = 1; i <= 2 * n; i++) {
        if (i > 1) std::cout << ' ';
        std::cout << perm[i];
      }
      std::cout << ": OK" << std::endl;
      return true;
    }
  }
} jury(3);
bool test;
int getN() {
  if (test) return jury.getN();
  int n;
  cin >> n;
  return n;
}
char ask(int a, int b) {
  if (test) return jury.ask(a, b);
  cout << "? " << a << ' ' << b << endl;
  char res;
  cin >> res;
  return res;
}
void checkAnsw() {
  if (test) {
    if (jury.check()) {
      if (!jury.next()) {
        std::exit(0);
      }
    } else {
      getchar();
      getchar();
      std::exit(0);
    }
  } else
    cout << '!' << endl;
}
void bfs(vector<vector<int>> &g, vector<pii> &arr, int start, int less_ind) {
  int n = g.size();
  queue<int> q;
  q.push(start);
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    if (!g[cur][less_ind]) {
      ++arr[cur].first;
      ++arr[less_ind].second;
      g[less_ind][cur] = -1;
      g[cur][less_ind] = 1;
      for (int i = 0; i < n; ++i)
        if (g[cur][i] == -1) q.push(i);
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  test = false;
  int t;
  if (test)
    t = 2e9;
  else
    cin >> t;
  while (t--) {
    int hn = getN();
    int n = hn << 1;
    vector<vector<int>> g(n, vector<int>(n));
    vector<pii> arr;
    vector<int> losers;
    arr.reserve(n);
    losers.reserve(hn);
    for (int i = 1; i < n; i += 2) {
      pii a = {1, 0}, b = {1, 0};
      char res = ask(i, i + 1);
      if (res == '<') {
        losers.push_back(i);
        ++b.first;
        ++a.second;
        g[i - 1][i] = -1;
        g[i][i - 1] = 1;
      } else {
        losers.push_back(i + 1);
        ++a.first;
        ++b.second;
        g[i][i - 1] = -1;
        g[i - 1][i] = 1;
      }
      arr.push_back(a);
      arr.push_back(b);
    }
    for (int i = 0; i < hn; ++i)
      for (int j = i + 1; j < hn; ++j) {
        int ind = losers[i];
        int jnd = losers[j];
        if (!g[ind - 1][jnd - 1]) {
          char res = ask(ind, jnd);
          int less_ind = ind - 1, start = jnd - 1;
          if (res == '>') swap(less_ind, start);
          bfs(g, arr, start, less_ind);
        }
      }
    int found = 0;
    while (found < hn) {
      pii mina = {2e9, 2e9}, minb = {2e9, 2e9};
      int mini = -1, minj = -1;
      for (int i = 0; i < n; ++i) {
        if (arr[i] < mina) {
          swap(mina, minb);
          swap(mini, minj);
          mina = arr[i];
          mini = i;
        } else if (arr[i] < minb) {
          minb = arr[i];
          minj = i;
        }
      }
      if (mina.first < minb.first) {
        arr[mini] = {2e9, 2e9};
        ++found;
      } else {
        char res = ask(mini + 1, minj + 1);
        int less_ind = mini, start = minj;
        if (res == '>') swap(less_ind, start);
        bfs(g, arr, start, less_ind);
      }
    }
    checkAnsw();
  }
  return 0;
}