#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
template <class T>
T modpow(T a, T b, T m) {
  T res = 1;
  for (; b; b /= 2, a = (a * a) % m)
    if (b & 1) res = (res * a) % m;
  return res;
}
template <class T>
T inv(T a, T b) {
  return 1 < a ? b - inv(b % a, a) * b / a : 1;
}
void re(int& e) { cin >> e; }
void re(long long& e) { cin >> e; }
void re(int* v, int n) {
  for (int i = (0); i < (n); i++) cin >> v[i];
}
void re(vector<int>& v, int n) {
  for (int i = (0); i < (n); i++) cin >> v[i];
}
void Solve() {
  const int N = 200000 + 99;
  int t, n;
  vector<int> a(N);
  re(t);
  while (t--) {
    re(n);
    re(a, n);
    multiset<int> L, R;
    set<int> Lu, Ru;
    for (int i = (0); i < (n); i++) R.insert(a[i]), Ru.insert(a[i]);
    vector<pair<int, int> > ans;
    for (int i = (0); i < (n - 1); i++) {
      L.insert(a[i]);
      R.erase(R.find(a[i]));
      Lu.insert(a[i]);
      if (!(R.find(a[i]) != R.end()) && (Ru.find(a[i]) != Ru.end()))
        Ru.erase(Ru.find(a[i]));
      if (*L.rbegin() == L.size() && L.size() == Lu.size() &&
          *R.rbegin() == R.size() && R.size() == Ru.size())
        ans.push_back({L.size(), R.size()});
    }
    cout << ans.size() << endl;
    for (auto& e : ans) cout << e.first << ' ' << e.second << endl;
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(6);
  Solve();
  return 0;
}
