#include <bits/stdc++.h>
using namespace std;                        
 
const int N=2e5+7;

int n;
int x=-1,y=-1,z=-1;
    
int a[N], t[N*4];
vector<int> suff(N), pref(N); 

void build(int v=1, int tl=1, int tr=n){
	 if(tl==tr) t[v]=a[tl];
	 else {
	  	int tm = (tl+tr)/ 2;
	  	build(v*2, tl, tm);
	  	build(v*2+1,tm+1,tr);
	  	t[v]=min(t[v*2], t[v*2+1]);
	 }
}
int get(int v, int tl, int tr, int l, int r){
 	if(l<=tl and tr<=r) return t[v];
 	if(r < tl || tr< l) return INT_MAX;
 	int tm=(tl + tr)>>1;
 	return min(get(v*2, tl, tm, l, r), get(v*2+1, tm+1,tr,l,r));
}
void calc(){
 	pref[1]=a[1];
 	for(int i=2;i<=n;i++) pref[i]=max(pref[i-1], a[i]);
  suff[n]=a[n];
  for(int i=n-1;i>=1;i--)	suff[i]=max(suff[i+1], a[i]);
}
int main(){
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int tt;
  cin>>tt;
  while(tt--){      
 		cin>>n;                  
 		for(int i = 1; i <= n; i++) cin>>a[i]; 
 		build();
 		calc();
 		bool flag=false;
 		int x, y, z;
 		for(int i=n;i>=3;i--){
 			int value = suff[i];
 			auto j1 = lower_bound(pref.begin(), pref.begin()+i-1, value); 
 			int start = j1 - pref.begin();

 			auto j2 = upper_bound(pref.begin(), pref.begin()+i-1, value);
 			int end = j2 - pref.begin();
 			//cout<<start<< ' ' <<end<<' ';
 			if(start >= end) continue;
 			
 			int low= start, high=end;
 			while(high - low > 1) {
 			 	int mid = (low + high) / 2;
 			 	if (get(1,1,n,mid, i-1)<value) {
 			 	 	low=mid;
 			 	} else {
 			 	 	high=mid;
 			 	}
 			}
 			//cout<< ' ' << high << '\n';
 			if (high < i and get(1,1,n,high,i-1) == value and pref[high-1] == value) {
 				x = high-1;
 				y = i-high;
 				z = n-i+1;
 			 	flag=true;
 			}
 		}
 		if(!flag)
  		cout<<"NO\n";
  	else
  		cout<<"YES\n"<<x<< ' ' << y << ' ' << z <<'\n';
  }
}
