#ifdef Prateek
  #include "\Prateek.h"
#else
  #include <bits/stdc++.h>
  using namespace std;
  #define debug(...) 42
#endif
#define F first
#define S second
#define pb push_back
#define f(i,x,n) for(int i=x;i<n;i++)
#define all(c) c.begin(),c.end()
using ll = long long;
const int MOD = 1e9+7, N = 1e5 + 10;

template <typename T, bool max_mode = true>
class SegTree{
public:
   vector<T> t,lazy;
   vector<T> A;
   int n;

   SegTree(int n){
      this->n = n;
      this->t.assign(4*n+10,0);
      this->lazy.assign(4*n+10,0);
   }

   SegTree(vector<T> a){
      this->n = a.size();
      this->A = a;
      this->t.assign(4*n,0);
      this->lazy.assign(4*n,0);
      build(1,0,n-1);
   }

   T fun(T a,T b){
      if (max_mode) return max(a, b);
      return min(a, b);
   }

   void build(int v,int tl,int tr){
      if(tl == tr){
         t[v] = A[tl];
      }else{
         int tm = (tl+tr)/2;
         build(2*v,tl,tm);
         build(2*v+1,tm+1,tr);
         t[v] = fun(t[2*v],t[2*v+1]);
      }
   }

   void push(int v) {
      t[v*2] += lazy[v];
      lazy[v*2] += lazy[v];
      t[v*2+1] += lazy[v];
      lazy[v*2+1] += lazy[v];
      lazy[v] = 0;
   }

   void update(int v, int tl, int tr, int l, int r, T addend) {
      if (l > r) 
         return;
      if (l == tl && tr == r) {
        t[v] += addend;
        lazy[v] += addend;
      } else {
        push(v);
        int tm = (tl + tr) / 2;
        update(v*2, tl, tm, l, min(r, tm), addend);
        update(v*2+1, tm+1, tr, max(l, tm+1), r, addend);
        t[v] = fun(t[v*2], t[v*2+1]);
      }
   }

   T query(int v, int tl, int tr, int l, int r) {
      if (l > r) {
         if (max_mode) return INT_MIN;
         return INT_MAX;
      }
      if (l <= tl && tr <= r)
        return t[v];
      push(v);
      int tm = (tl + tr) / 2;
      return fun(query(v*2, tl, tm, l, min(r, tm)), 
               query(v*2+1, tm+1, tr, max(l, tm+1), r));
   }

   void update(int l,int r,T val){
      update(1,0,n-1,l,r,val);
   }

   void update(int i,T val){
      update(i,i,val);
   }

   T query(int l,int r){
      return query(1,0,n-1,l,r);
   }

   T query(int i){
      return query(i,i);
   }
};

void test(){
   int n;
   cin >> n;
   vector <int> a(n+1);
   for (int i = 1; i <= n; ++i) {
      cin >> a[i];
   }
   vector <int> pre(n+2), suff(n+2);
   for (int i = 1; i <= n; ++i) {
      pre[i] = max(pre[i-1], a[i]);
   }
   for (int i = n; i ; --i) {
      suff[i] = max(suff[i+1], a[i]);
   }
   SegTree<int, false> st_mn(a);
   for (int i = 1; i <= n; ++i) {
      int l = i + 1, r = n;
      int res = -1;
      int mx_x = pre[i];
      while (l <= r) {
         int m = (l + r) / 2;
         int mx_z = suff[m];
         int mn_y = st_mn.query(i+1, m-1);
         if (mx_x == mx_z and mx_x == mn_y) {
            res = m;
            break;
         }
         if (mn_y < mx_x) {
            r = m - 1;
         } else {
            if (mx_z < mx_x) {
               r = m - 1;
            } else {
               l = m + 1;
            }
         }
      }
      if (res != -1) {
         cout << "YES\n";
         cout << i << ' ' << (res - i - 1) << ' ' << n - i - (res - i - 1) << '\n';
         return;
      }
   } 
   cout << "NO\n";
   return;
}

int32_t main(){
   ios::sync_with_stdio(false);
   cin.tie(NULL);
   int tt = 1;
   cin >> tt;
   f(i,0,tt) test();   
   return 0;
}