#include <bits/stdc++.h>
using namespace std;
int ans[55][55];
int t;
int n;
vector<int> fight;
vector<int> fight_min[50];
vector<int> fight_max[50];
int sz;
int resp;
int nw;
int mi, ma;
bool spec[55];
string x;
inline void answer(int mi, int ma) {
  cout << '!' << ' ' << mi << ' ' << ma << '\n';
  fflush(stdout);
}
inline int ask(int i, int j) {
  if (ans[i][j] != -2) return ans[i][j];
  string an;
  cout << "? " << i << ' ' << j << '\n';
  fflush(stdout);
  getline(cin, an);
  if (an == "=") return ans[i][j] = ans[j][i] = 0;
  if (an == "<") return -1 * (ans[j][i] = -1 * (ans[i][j] = -1));
  return -1 * (ans[j][i] = -1 * (ans[i][j] = 1));
}
int main() {
  cin >> t;
  while (t--) {
    for (int i = 0; i < 55; ++i)
      for (int j = 0; j < 55; ++j) ans[i][j] = -2;
    fight.clear();
    for (int i = 0; i < 50; ++i) {
      fight_max[i].clear();
      fight_min[i].clear();
    }
    cin >> n;
    getline(cin, x);
    if (n == 1) {
      cout << "! 1 1\n";
      continue;
    }
    memset(spec, false, sizeof(spec));
    for (int i = 1; i <= n; ++i) fight.push_back(i);
    sz = fight.size();
    for (int i = 0; i < sz; i += 2) {
      if (i + 1 == sz) {
        fight_max[0].push_back(fight[i]);
        spec[fight[i]] = true;
      } else {
        resp = ask(fight[i], fight[i + 1]);
        if (resp == 0) {
          fight_max[0].push_back(fight[i]);
          fight_min[0].push_back(fight[i + 1]);
        } else if (resp == -1) {
          fight_max[0].push_back(fight[i + 1]);
          fight_min[0].push_back(fight[i]);
        } else if (resp == 1) {
          fight_min[0].push_back(fight[i + 1]);
          fight_max[0].push_back(fight[i]);
        }
      }
    }
    nw = 0;
    while (fight_max[nw].size() != 1) {
      sz = fight_max[nw].size();
      for (int i = 0; i < sz; i += 2) {
        if (i + 1 == sz) {
          fight_max[nw + 1].push_back(fight_max[nw][i]);
        } else {
          resp = ask(fight_max[nw][i], fight_max[nw][i + 1]);
          if (resp == 0) {
            if (spec[fight_max[nw][i]]) {
              fight_max[nw + 1].push_back(fight_max[nw][i]);
            } else
              fight_max[nw + 1].push_back(fight_max[nw][i + 1]);
          } else if (resp == -1) {
            fight_max[nw + 1].push_back(fight_max[nw][i + 1]);
            if (spec[fight_max[nw][i]]) {
              spec[fight_max[nw][i]] = false;
              fight_min[0].push_back(fight_max[nw][i]);
            }
          } else {
            fight_max[nw + 1].push_back(fight_max[nw][i]);
            if (spec[fight_max[nw][i + 1]]) {
              spec[fight_max[nw][i + 1]] = false;
              fight_min[0].push_back(fight_max[nw][i + 1]);
            }
          }
        }
      }
      ++nw;
    }
    ma = fight_max[nw][0];
    nw = 0;
    while (fight_min[nw].size() != 1) {
      sz = fight_min[nw].size();
      for (int i = 0; i < sz; i += 2) {
        if (i + 1 == sz) {
          fight_min[nw + 1].push_back(fight_min[nw][i]);
        } else {
          resp = ask(fight_min[nw][i], fight_min[nw][i + 1]);
          if (resp == 0) {
            fight_min[nw + 1].push_back(fight_min[nw][i]);
          } else if (resp == 1) {
            fight_min[nw + 1].push_back(fight_min[nw][i + 1]);
          } else {
            fight_min[nw + 1].push_back(fight_min[nw][i]);
          }
        }
      }
      ++nw;
    }
    mi = fight_min[nw][0];
    answer(mi, ma);
  }
  return 0;
}
