#include<bits/stdc++.h>
#define ll         int
#define ff         first
#define ss         second
#define pb         push_back
#define srt(v)     sort(v.begin(),v.end())
#define rsrt(v)    sort(v.rbegin(),v.rend())
#define mkp(a,b)   make_pair(a,b)
#define scf2(a,b)  scanf("%lld%lld",&a,&b)
#define scf(a)     scanf("%d",&a)
#define pf(a)      printf("%lld\n",a)
#define maxn       200005
#define INF        1000000000002
using namespace std;

ll tree[maxn*4] , arr[maxn], n;

void build(ll node,ll b,ll e){
    if(b==e) {
        tree[node]=arr[b];
        return ;
    }
    ll mid=(b+e)>>1;
    ll l=node<<1;
    ll r=l+1;
    build(l,b,mid);
    build(r,mid+1,e);
    tree[node]=min(tree[l],tree[r]);
}
ll query(ll node,ll b,ll e,ll i,ll j){
    if(i>e||b>j) return INT_MAX;
    if(b>=i&&j>=e) return tree[node];
    int mid=(b+e)>>1;
    int l=node<<1;
    int r=l+1;
    return min(query(l,b,mid,i,j),query(r,mid+1,e,i,j));
}

int main()
{
    ll tc;
    scf(tc);

    while(tc--)
    {
        scf(n);

        ll  suf[n+5] , pre[n+5];

        pre[0] = 0 , suf[n+1] = 0 , suf[0] = 0 , pre[n+1] = 0;

        for(ll i=1;i<=n;i++)scf(arr[i]);

        pre[1] = arr[1];

        for(ll i=2;i<=n;i++)pre[i] = max(arr[i] , pre[i-1]);

        suf[n] = arr[n];

        bool sol = false;

        for(ll i=n-1;i>=1;i--)suf[i] = max(suf[i+1] , arr[i]);

        build(1 , 1 , n);

        //cout << "joss" << endl;

        ll x , y , z;

        //cout << query(1 , 1 , n , 2 , n-1) << endl;

        for(ll i=2;i<n;i++)
        {
            ll b = 1 , e = i-1 , l = i , r = i;

            //cout << "ptr" << endl;

            while(b<=e)
            {
                ll mid = (b+e)/2;

                ll val = query(1 , 1 , n , mid , i-1);

                //cout << val << " " << mid << " " << i-1<< endl;
                if(val>=arr[i])
                {
                    l = min(mid , l);

                    e = mid - 1;
                }

                else b = mid + 1;
            }

            //cout << b << " " << e << endl;

            b = i+1 , e = n;

            while(b<=e)
            {
                ll mid = (b+e)/2;
                if(query(1 , 1 , n , i+1 , mid)>=arr[i])
                {
                    r = max(mid , r);

                    b = mid + 1;
                }

                else e = mid - 1;
            }

         //  cout << l << " " << r << " " << i << " " << query(1 , 1 , n , l , r) << " " << pre[l-1] << " " << suf[r+1] << endl;



            if(arr[l] == arr[i] && pre[l-1]<arr[i])l++;
            if(arr[r] == arr[i] && suf[r+1]<arr[i])r--;

            ll kop = query(1 , 1 , n , l , r);



           // cout << l << " " << r << endl;

            //cout << "joss" << endl;

           // cout <<l << " " << r << " " << pre[l-1] << " " << arr[i] << " " << kop << " " << suf[r+1] << endl;

            if(pre[l-1] == arr[i] && arr[i] == suf[r+1] && arr[i] == kop && l>1 && r<n && l<=r)
            {
                sol = true;

                //cout << "djukce" << endl;

                x = l - 1 , y = r - l +1 , z = n - r;

               // break;
            }
        }

        if(!sol)printf("NO\n");
        else
        {
            printf("YES\n");

            printf("%d %d %d\n",x , y , z);
        }
    }
}
