#include <bits/stdc++.h>
#define ll long long
#define VNAME(value) (#value)
#define pr(x) cout << VNAME(x) << " = " << x << '\n'
using namespace std;

inline void rd();
inline void debug();
constexpr int N = 5e5 + 9;
constexpr ll mod = 1e9 + 7;
int T,n,m,k,a[N];

vector<int>pre[N],suf[N],e;

int top,sta[N],f[N],ls[N],rs[N];

bool flag = false;
int x,y,z;
void dfs(int l,int r,int mid) {
	if(flag) return;
	int L = lower_bound(pre[a[mid]].begin(),pre[a[mid]].end(),l - 1) - pre[a[mid]].begin();
	int R = lower_bound(suf[a[mid]].begin(),suf[a[mid]].end(),mid + 1) - suf[a[mid]].begin();
	L = pre[a[mid]][L];
	R = suf[a[mid]][R];
//	if(mid == 7) {
//		cout << "* " << mid << " " << L << " " << R << endl;
////		cout << a[mid] << endl;
////		for(int i = 0; i < suf[a[mid]].size(); ++ i) cout << suf[a[mid]][i] << " \n"[i == (suf[a[mid]].size() - 1)];
//		cout << mid << " " << l << " " << r << endl;
//		cout << L << " " << l - 1 << " " << mid - 1 << endl;
//		cout << R << " " << mid + 1 <<"  " << r << endl;
//	}
	if((L >= l - 1 && L <= mid - 1) &&  (R >= mid + 1 && R <= r + 1 &&R != n + 1)) {
		x = L;
		y = R - x - 1;
		z = n - x - y;
		if(x > 0 && y > 0 && z > 0) {
			int mx = 0;
//			cout << "L = " << L << " " << "R = " << R << endl;
//			for(int i = 1; i <= x; ++ i) {
//				mx = max(mx,a[i]);
//			}
//			cout << "mx = " << mx << " ";
//
//			mx = n + 1;
//			for(int i = x + 1; i <= x + y; ++ i) {
//				mx = min(mx,a[i]);
//			}
//			cout << "mn = " << mx << " ";
//			mx = 0;
//			for(int i = x + y + 1; i <= n; ++ i) {
//				mx = max(mx,a[i]);
//			}
//			cout << "mx = " << mx << endl;
			flag = true;
			return;
		}
	}
	if(ls[mid]) dfs(l,mid - 1,ls[mid]);
	if(rs[mid]) dfs(mid + 1,r,rs[mid]);
}
void Dmymax_ly() {
	rd();
	for(scanf("%d",&T); T ; T--) {

		scanf("%d",&n);
		flag = false;
		x = y = z = -1;
		e.clear();
		for(int i = 1; i <= n; ++ i) {
			scanf("%d",a + i);
			e.push_back(a[i]);
			suf[i].clear();
			pre[i].clear();
		}

		sort(e.begin(),e.end());

		e.erase(unique(e.begin(),e.end()),e.end());

		for(int i = 1; i <= n; ++ i) a[i] = lower_bound(e.begin(),e.end(),a[i]) - e.begin() + 1;

		for(int i = 1; i <= n; ++ i) {
			f[i] = max(f[i - 1],a[i]);
			pre[f[i]].push_back(i);
		}
		for(int i = 1; i <= n; ++ i) pre[i].push_back(n + 1);
		for(int i = 1; i <= n; ++ i) suf[i].push_back(n + 1);

		f[n + 1] = 0;
		for(int i = n; i >= 1; -- i) {
			f[i] = max(f[i + 1],a[i]);
			suf[f[i]].push_back(i);
		}

		for(int i = 1; i <= n; ++ i) {
			sort(pre[i].begin(),pre[i].end());
			sort(suf[i].begin(),suf[i].end());
		}

		for(int i = 1; i <= n; ++ i) ls[i] = rs[i] = 0;

		for(int i = 1; i <= n; ++ i) {
			int now = top;	// < 最大值， > 最小值
			while(now > 0 && a[sta[now]] > a[i]) -- now;
			if(now != 0) rs[sta[now]] = i;
			if(now < top) ls[i] = sta[now + 1];
			sta[++ now] = i;
			top = now;
		}

		int rt = 1;
		while(sta[top]) {
			rt = sta[top];
			-- top;
		}
//		cout << "rt = " << rt << " " << a[rt] << endl;
		dfs(1,n,rt);

		if(flag) {
			puts("YES");
			printf("%d %d %d\n",x,y,z);
		} else puts("NO");
	}
	return;
}
/*int cnt,head[N];struct E {int to,nxt;ll w;}e[N << 1];void add(int x,int y) {e[cnt] = {y,head[x]};head[x] = cnt++;}
ll mod_pow(ll a,ll b){ll res = 1;while(b){if(b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;} return res;}*/
int main() {
	Dmymax_ly();
	return 0;
}
void rd() {
#ifdef Consolasy
	freopen("test.in", "r", stdin);
#endif
}
void debug() {
	puts("*******************************");
}

