#include <bits/stdc++.h>
using namespace std;
#define _USE_MATH_DEFINES

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ld,ld> pdd;
typedef complex<ld> pt;

const char nl = '\n';
const ll INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const ll MOD = 1e9+7;
const ld EPS = 1e-13;
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());

const int N = 4e5+2;
int a[N], v[N];

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cout << fixed << setprecision(10);

	int T;
	cin >> T;
	while (T--) {
		int n;
		cin >> n;
		int pre = -1;
		int m = 0;
		for(int i=0; i<n; i++) {
			cin >> v[i];
			if(v[i] != pre) {
				a[++m] = 0;
				pre = v[i];
			}
			a[m]++;
		}
		//cerr<<"input: "; for(int i=1; i<=m; i++) {
			//cerr<<a[i]<<" "; }
		//cerr<<nl;
		int cur = 0;
		int mid = 1;
		while(mid<=m && cur + a[mid] <= n/2) {
			cur += a[mid++];
		}
		int nxt = 0;
		int val = 2;
		while(val<mid && nxt < a[1]) {
			nxt += a[val++];
		}
		int last = cur - a[1] - nxt;
		if(a[1] <= nxt && a[1] <= last) {
			cout << a[1] << " " << nxt << " " << last << nl;
		} else {
			cout << 0 << " " << 0 << " " << 0 << nl;
		}
	}

	return 0;
}
