

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.*;


public class wef {
public static class FastReader {
	BufferedReader br;
	StringTokenizer st;
	//it reads the data about the specified point and divide the data about it ,it is quite fast
	//than using direct 

	public FastReader() {
		br = new BufferedReader(new InputStreamReader(System.in));
	}

	String next() {
		while (st == null || !st.hasMoreTokens()) {
			try {
				st = new StringTokenizer(br.readLine());
			} catch (Exception r) {
				r.printStackTrace();
			}
		}
		return st.nextToken();
	}

	int nextInt() {
		return Integer.parseInt(next());//converts string to integer
	}

	double nextDouble() {
		return Double.parseDouble(next());
	}

	long nextLong() {
		return Long.parseLong(next());
	}

	String nextLine() {
		String str = "";
		try {
			str = br.readLine();
		} catch (Exception r) {
			r.printStackTrace();
		}
		return str;
	}
}
static ArrayList<String>list1=new ArrayList<String>();
static void combine(String instr, StringBuffer outstr, int index,int k)
{
	if(outstr.length()==k)
	{
		list1.add(outstr.toString());return;
	}
	if(outstr.toString().length()==0)
	outstr.append(instr.charAt(index));
    for (int i = 0; i < instr.length(); i++)
    {
        outstr.append(instr.charAt(i));
       
        combine(instr, outstr, i + 1,k);
        outstr.deleteCharAt(outstr.length() - 1);
    }
   index++;
} 
static ArrayList<ArrayList<Integer>>l=new ArrayList<>();
static void comb(int n,int k,int ind,ArrayList<Integer>list)
{
	if(k==0)
	{
		l.add(new ArrayList<>(list));

		return;
	}
	
	
	for(int i=ind;i<=n;i++)
	{
		list.add(i);
		comb(n,k-1,ind+1,list);
		
		list.remove(list.size()-1);
		
	}
	
	
	
	
	

}
static long sum(long n)
{
	long sum=0;
	while(n!=0)
	{
		sum+=n%10;
		n/=10;
	}
	return sum;
}


static boolean check(HashMap<Integer,Integer>map)
{
	for(int h:map.values())
		if(h>1)
			return false;
	return true;
}

static class Pair implements Comparable<Pair>{
    int x;int y;
    Pair(int x,int y){
        this.x=x;
        this.y=y;
      //  this.i=i;
    }
	@Override
	public int compareTo(Pair o) {
		// TODO Auto-generated method stub
		return x-o.x;
		
	}
}
static long ncr(long n, int k) 
{ long m=(long)1e9+7;
    long C[] = new long[k + 1]; 
     
    // nC0 is 1 
    C[0] = 1;   
   
    for (int i = 1; i <= n; i++) 
    { 
        // Compute next row of pascal  
        // triangle using the previous row 
        for (int j = Math.min(i, k); j > 0; j--) 
            C[j] = (C[j]%m + C[j-1]%m)%m; 
    } 
    return C[k]%m; 
} 
static boolean isPrime(int n) 
{ 
    // Corner cases 
    if (n <= 1) 
        return false; 
    if (n <= 3) 
        return true; 
  
    // This is checked so  
    // that we can skip 
    // middle five numbers 
    // in below loop 
    if (n % 2 == 0 ||  
        n % 3 == 0) 
        return false; 
  
    for (int i = 5; 
             i * i <= n; i = i + 6) 
        if (n % i == 0 || 
            n % (i + 2) == 0) 
            return false; 
  
    return true; 
} 
static long pow(long a, long n, long mod) {
	//		a %= mod;
	long ret = 1;
	int x = 63 - Long.numberOfLeadingZeros(n);
	for (; x >= 0; x--) {
		ret = ret * ret % mod;
		if (n << 63 - x < 0)
			ret = ret * a % mod;
	}
	return ret;
}



static int maxsum=0;
static long dp[]=new long[100000];
static long recur(int a[],int ind,int tempsum)
 {
	 if(ind>=a.length)
	 {//System.out.println(tempsum);
		 if(maxsum==0)
			 maxsum=tempsum;
		 else
		 maxsum=Math.max(maxsum, tempsum);
		 return maxsum;
	 }
	 if(dp[ind]!=-1)
		 return dp[ind];
	 
	// System.out.println(tempsum);
	 int ct=0;
	 for(int i=ind;i<ind+(a.length-ind)/2;i++)
	 {ct++;
//	 if(ind+ct<a.length)
	 {	 tempsum+=a[i];
		 
		dp[i]= recur(a,ind+(2*ct),tempsum);}
		 
	 }
	 
	 return dp[ind];
 }
 static int gcd(int a,int b)
 {
	 if(b==0)
		 return a;
	 return gcd(b,a%b);
 }
 static int lcm(int a,int b)
 {
	 return (a*b)/gcd(a,b);
 }
 
  static int power(int n,int pow)
  {
	  if(pow==1)
		  return n;
	  else if(pow%2==0)
	  {
		  return power(n*n,pow/2);
	  }
	  else
		  return n*power(n*n,pow/2);
  }
 
 
 static HashSet<Long> factorize(long n) {
	    HashSet<Long> facts=new HashSet<Long>();
	    for (long i = 2; i * i <= n; ++i) {
	        while (n % i == 0) {
	            facts.add(i);
	            n /= i;
	        }
	    }
	 
	    if (n != 1) {
	        facts.add(n);
	    }
	    return facts;
	}
 static int count;static boolean vis[];
 static void dfs(ArrayList a[],boolean vis[],int v)
 {
	 if(vis[v]==true)
		 return;
	 
	 vis[v]=true;
	 count++;
	 for(Object h:a[v])
	 {
		 if(vis[(int) h]==false)
		 {
			 dfs(a,vis,(int)h);
		 }
	 }
	 
 }
 static int find(int parent[],int a)
 {
	 if(parent[a]!=a)
		 parent[a]= find(parent,parent[a]);
	 return parent[a];
 }
 
public static PrintWriter out = new PrintWriter (new BufferedOutputStream(System.out));

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	FastReader in=new FastReader();
	//TreeMap<Long,Integer>map=new TreeMap<Long,Integer>();
	ArrayList<Long>list=new ArrayList<Long>();
//	HashSet<Integer>set=new HashSet<Integer>();
	HashSet<Integer>set=new HashSet<Integer>();
	Deque<Integer>qu=new LinkedList<Integer>();
	
		
	
	int t=in.nextInt();
	while(t-->0)
	{
		int n=in.nextInt();
		int a[]=new int[n];
		TreeMap<Integer,Integer>map=new TreeMap<Integer,Integer>();
		for(int i=0;i<n;i++)
		{
			a[i]=in.nextInt();
			map.put(a[i],map.getOrDefault(a[i], 0)+1);
		}
		if(map.size()<3)
		{
			out.println(0+" "+0+" "+0);
			continue;
		}
		StringBuilder sb=new StringBuilder();
		int ct=0;int sum=0;int temp=0;
		int p=0;int q=0;int r=0;
		for(int h:map.descendingKeySet())
		{h=map.get(h);
			
			sum+=h;ct++;
			if(sum>n/2)
			{
				sum-=h;
				break;
			}
			
			if(ct==1)
				p=h;
			else if(ct>1&&q<=p)
			{
				q+=h;
			}
			else	
			{
				r+=h;
				
			}
			
		}
		
		if(sum<=n/2&&(p!=q&&p!=r&&p!=0&&q!=0&&r!=0))
		{
			//sb.append(temp);
			out.println(p+" "+q+" "+r);
		}
		else
			out.println(0+" "+0+" "+0);
		out.flush();
		
		
	}
	out.flush();
	
	
	
	}
	
 }
