#include <bits/stdc++.h>   using namespace std;   const long long INFL = 1LL << 60;   const long long INF = INFL;   long long MOD = 1000000007;   vector<long long> dy = {0, -1, 0, 1, 1, 1, -1, -1, 0};   vector<long long> dx = {1, 0, -1, 0, 1, -1, 1, -1, 0};   void pres(double A, long long x = 10) {     cout << fixed << setprecision(x) << A << endl;   }   void BinarySay(long long x, long long y = 60) {     for (long long i = 0; i < (y); i++) cout << (x >> (y - 1 - i) & 1);     cout << endl;   }   long long get_bit(long long x) { return __builtin_popcountll(x); }   long long pow_long(long long x, long long k) {     long long res = 1;     while (k > 0) {       if (k % 2) res *= x;       x *= x;       k /= 2;     }     return res;   }   long long pow_mod(long long x, long long k) {     long long res = 1;     while (k > 0) {       if (k % 2) {         res *= x;         res %= MOD;       }       x *= x;       x %= MOD;       k /= 2;     }     return res;   }   long long inverse(long long x) { return pow_mod(x, MOD - 2); };   long long gcd(long long a, long long b) {     if (b == 0) return a;     return gcd(b, a % b);   }   long long lcm(long long x, long long y) { return x / gcd(x, y) * y; };   long long kai_mod(long long x) {     if (x == 0) return 1;     return x * kai_mod(x - 1) % MOD;   }   vector<long long> divisor(long long n) {     vector<long long> res(0);     for (long long i = 1; i * i <= n; i++) {       if (n % i == 0) {         res.push_back(i);         if (i != n / i) res.push_back(n / i);       }     }     sort(res.begin(), res.end());     return res;   }   vector<long long> MakePrimeList(long long x) {     vector<long long> res;     for (long long k = 2; k * k <= x; k++) {       if (x % k == 0) {         res.push_back(k);         while (x % k == 0) x /= k;       }     }     if (x > 1) res.push_back(x);     return res;   }   const int MAXcomb = 2000100;   long long fac[MAXcomb], finv[MAXcomb], inv[MAXcomb];   void COMinit() {     fac[0] = fac[1] = 1;     finv[0] = finv[1] = 1;     inv[1] = 1;     for (int i = 2; i < MAXcomb; i++) {       fac[i] = fac[i - 1] * i % MOD;       inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;       finv[i] = finv[i - 1] * inv[i] % MOD;     }   }   long long comb(int n, int k) {     if (n < k) return 0;     if (n < 0 || k < 0) return 0;     return fac[n] * finv[k] % MOD * finv[n - k] % MOD;   }   long long disit(long long x, long long d = 10) {     long long res = 0;     while (x) {       res++;       x /= d;     }     return res;   }   void compress(vector<long long> &S) {     vector<long long> xs;     for (long long i = 0; i < (S.size()); i++) xs.push_back(S[i]);     sort(xs.begin(), xs.end());     xs.erase(unique(xs.begin(), xs.end()), xs.end());     for (long long i = 0; i < (S.size()); i++) {       S[i] = lower_bound(xs.begin(), xs.end(), S[i]) - xs.begin();     }   }   void solve() {     long long N;     cin >> N;     vector<long long> A(N);     for (long long i = 0; i < (N); i++) cin >> A[i];     compress(A);     long long M = A[0] + 1;     vector<long long> cnt(M, 0);     for (long long i = 0; i < (N); i++) cnt[A[i]]++;     long long g = cnt[M - 1];     long long second = 0;     long long at = M;     for (long long i = (M)-1; i >= 0; i--) {       if (i == M - 1) continue;       second += cnt[i];       at = i;       if (second > g) break;     }     long long B = 0;     long long b = 0;     for (long long i = at - 1; i >= 0; i--) {       b += cnt[i];       if (b <= g) continue;       if ((g + second + b) * 2 > N) break;       B = b;     }     if (B == 0) g = second = 0;     cout << g <<     << second <<     << B << endl;   }   int main() {     cin.tie(0);     ios::sync_with_stdio(false);     long long T;     cin >> T;     for (long long i = 0; i < (T); i++) {       solve();     }   }