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 ll = int64_t;
using ld = long double;
using ii = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;
using vii = vector<ii>;
const char SPACE = ' ', ENDL = '\n';
const int MODULO = 1e9 + 7;
void readd(ll& target, ll add) {
  target += add;
  target %= MODULO;
}
void remult(ll& target, ll mult) {
  target *= mult;
  target %= MODULO;
}
ll binpow(ll base, ll power) {
  if (0 == power) return 1;
  ll half = binpow(base, power >> 1);
  remult(half, half);
  if (power & 1) remult(half, base);
  return half;
}
template <typename T>
T read() {
  T value;
  cin >> value;
  return value;
}
int ri() { return read<int>(); }
ll rll() { return read<ll>(); }
string rs() { return read<string>(); }
template <typename T>
vector<T> rv(size_t size) {
  vector<T> a(size);
  for (size_t i = 0; i < size; ++i) {
    a[i] = read<T>();
  }
  return a;
}
bool yesNo(bool result, string yes = "YES", string no = "NO") {
  cout << (result ? yes : no) << ENDL;
  return result;
}
template <typename T>
void remin(T& target, T source) {
  target = min(target, source);
}
template <typename T>
void remax(T& target, T source) {
  target = max(target, source);
}
template <typename N, typename D>
N ceil_div(N numerator, D denominator) {
  return (numerator - 1) / denominator + 1;
}
ll for_pow(ll base, int power) {
  ll result = 1;
  for (int i = 0; i < power; ++i) result *= base;
  return result;
}
vector<string> split(string& s, string seps) {
  vector<string> parts;
  string part = "";
  auto add_part = [&]() {
    parts.push_back(part);
    part = "";
  };
  for (char ch : s) {
    if (string::npos != seps.find(ch)) {
      add_part();
    } else {
      part += ch;
    }
  }
  add_part();
  return parts;
}
ld sqrt_ld(ld value) { return sqrt(value); }
int get_bit(ll mask, int bit) { return (mask >> bit) & 1; }
void init_io() {
  string file_name = "";
  if (!file_name.empty()) {
    string input_file_name = file_name + ".in";
    freopen(input_file_name.c_str(), "rt", stdin);
    string output_file_name = file_name + ".out";
    freopen(output_file_name.c_str(), "wt", stdout);
  } else {
  }
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << setprecision(10) << fixed;
}
void get_answer(int n) {
  n *= 2;
  int unknown = 0, lose = -1, win = 1;
  vector<vi> cmp(n, vi(n, unknown));
  vi wins(n, 0), matches(n, 0);
  auto ask = [&](int a, int b) {
    if (a == b) return;
    cout << "?" << SPACE << a + 1 << SPACE << b + 1 << endl;
    string res = rs();
    if ("<" == res) {
      swap(a, b);
    }
    for (int v = 0; v < n; ++v) {
      if (v == b) continue;
      bool better = (v == a || win == cmp[v][a]);
      if (better && cmp[v][b] == unknown) {
        cmp[v][b] = win;
        cmp[b][v] = lose;
        ++wins[v];
        ++matches[v];
      }
    }
    matches[b] = 0;
    for (int v = 0; v < n; ++v) {
      if (cmp[v][b] != unknown) ++matches[b];
    }
  };
  vector<bool> used(n, false);
  for (int v = 0; v < n; v += 2) {
    ask(v, v + 1);
  }
  int half = n / 2;
  while (true) {
    int cnt = 0;
    for (int wv : wins) {
      if (wv >= half) ++cnt;
    }
    if (half <= cnt) {
      break;
    }
    while (true) {
      int min_wins = n;
      for (int v = 0; v < n; ++v) {
        if (used[v]) continue;
        remin(min_wins, wins[v]);
      }
      std::priority_queue<ii, vii, greater<ii>> candidates;
      for (int v = 0; v < n; ++v) {
        if (used[v]) continue;
        if (wins[v] > min_wins) continue;
        int vm = matches[v];
        candidates.push({vm, v});
        if (candidates.size() > 3) {
          candidates.pop();
        }
      }
      assert(candidates.size() > 0);
      auto first = candidates.top().second;
      candidates.pop();
      if (candidates.empty()) {
        used[first] = true;
      } else {
        int second = candidates.top().second;
        candidates.pop();
        if (!candidates.empty()) {
          int third = candidates.top().second;
          candidates.pop();
          if (matches[third] == matches[second]) {
            swap(third, first);
          }
        }
        ask(first, second);
        break;
      }
    }
  }
}
void solve_test() {
  int n = ri();
  get_answer(n);
  cout << "!" << endl;
}
void solve() {
  int t = ri();
  while (t-- > 0) {
    solve_test();
  }
}
int main() {
  int tests = 1;
  while (tests-- > 0) {
    solve();
  }
  return 0;
}