#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
using db = double;
using ll = long long;
using ull = unsigned long long;
using pII = pair<int, int>;
using pLL = pair<ll, ll>;
constexpr int mod = 1e9 + 7;
template <class T1, class T2>
inline void chadd(T1 &x, T2 y) {
  x += y;
  while (x >= mod) x -= mod;
  while (x < 0) x += mod;
}
template <class T1, class T2>
inline void chmax(T1 &x, T2 y) {
  if (x < y) x = y;
}
template <class T1, class T2>
inline void chmin(T1 &x, T2 y) {
  if (x > y) x = y;
}
inline int rd() {
  int x;
  cin >> x;
  return x;
}
template <class T>
inline void rd(T &x) {
  cin >> x;
}
template <class T>
inline void rd(vector<T> &vec) {
  for (auto &it : vec) cin >> it;
}
void err() {
  cout << "\033[39;0m"
       << "\n";
}
template <class T, class... Ts>
void err(const T &arg, const Ts &...args) {
  cout << arg << ' ';
  err(args...);
}
template <template <typename...> class T, typename t, typename... A>
void err(const T<t> &arg, const A &...args) {
  for (auto &v : arg) cout << v << ' ';
  err(args...);
}
void ptt() { cout << "\n"; }
template <class T, class... Ts>
void ptt(const T &arg, const Ts &...args) {
  cout << ' ' << arg;
  ptt(args...);
}
template <class T, class... Ts>
void pt(const T &arg, const Ts &...args) {
  cout << arg;
  ptt(args...);
}
void pt() {}
template <template <typename...> class T, typename t, typename... A>
void pt(const T<t> &arg, const A &...args) {
  for (int i = 0, sze = arg.size(); i < sze; ++i)
    cout << arg[i] << " \n"[i == sze - 1];
  pt(args...);
}
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll qpow(ll base, ll n) {
  ll res = 1;
  while (n) {
    if (n & 1) res = res * base % mod;
    base = base * base % mod;
    n >>= 1;
  }
  return res;
}
constexpr int N = 4e5 + 10;
int n, a[N];
void run() {
  n = rd();
  int limit = n / 2, Max = 0, g = 0, s = 0, b = 0;
  for (int i = 1; i <= n; ++i) a[i] = rd();
  int l = 1, l1 = 1, l2 = 1;
  while (l < n) {
    while (l < n && a[l + 1] == a[l]) ++l;
    while (l1 < n && (a[l1 + 1] == a[l1] || l1 - l <= l)) ++l1;
    while (l2 < n && (a[l2 + 1] == a[l2] || l2 - l1 <= l)) ++l2;
    if (l2 <= limit) {
      while (l2 < limit) {
        int nx = upper_bound(a + 1, a + 1 + n, a[l2 + 1],
                             [&](int x, int y) { return x > y; }) -
                 a - 1;
        if (nx <= limit) {
          l2 = nx;
        } else {
          break;
        }
      }
      if (l2 > Max) {
        Max = l2;
        g = l;
        s = l1 - l;
        b = l2 - l1;
      }
    }
    ++l;
  }
  pt(g, s, b);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cout << fixed << setprecision(20);
  int _T = rd();
  while (_T--) run();
  return 0;
}
