#include<bits/stdc++.h>

using namespace std;

/*

        Bismillahir Rahmanir Rahim
        Problem :
        Problem Link :
        Topics :
        Solver : Masud Parves
        I Love Code More than Sharks Love Blood <3
*/

#define ff first
#define ss second
#define mp make_pair
#define SZ(a)           (int)a.size()
#define all(a)  a.begin(), a.end()
#define allr(a)  a.rbegin(), a.rend()


#define sf(a)           scanf("%d",&a)
#define sff(a,b)        scanf("%d %d",&a,&b)
#define sfff(a,b,c)     scanf("%d %d %d",&a,&b,&c)

#define f0(i,b) for(int i=0;i<(b);i++)
#define f1(i,b) for(int i=1;i<=(b);i++)
#define f2(i,a,b) for(int i=(a);i<=(b);i++)
#define fr(i,b,a) for(int i=(b);i>=(a);i--)

#define CIN ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
#define TEST_CASE(t) for(int zz=1 ; zz<=t ; zz++)
#define PRINT_CASE printf("Case %d: ",zz)
#define endl            "\n"
#define Debug(x)            cout<<#x " = "<<(x)<<endl
#define NOT_VISITED 0
#define IS_VISITED 1
#define WHITE 0
#define GRAY 1
#define BLACK 2

int fx[4]= {1,-1,0,0};
int fy[4]= {0,0,1,-1};

/*-----------------------Bitmask------------------*/
//int Set(int N,int pos){return N=N  (1<<pos);}
//int Reset(int N,int pos){return N= N & ~(1<<pos);}
//bool Check(int N,int pos){return (bool)(N & (1<<pos));}
/*------------------------------------------------*/

const double PI = acos(-1.0);
const double EPS = 1e-6;
const int MOD = (int)1e9+7;
const int maxn = (int)2e5+5;


typedef long long ll;
const ll inf = 5e18+100;
typedef unsigned long long ull;
typedef pair<ll, int> plli;
typedef pair<int, ll> pill;
typedef vector<int> vi;
int n;

int treemx[4*maxn],treemn[4*maxn], arr[maxn];

void Build(int node, int s, int f){
     if(s==f){
        treemx[node]=arr[f];
        treemn[node]=arr[f];
        return;
    }
    int left=node<<1;
    int right=left+1;
    int mid=(s+f)/2;
    Build(left,s,mid);
    Build(right,mid+1,f);
    treemx[node]=max(treemx[left],treemx[right]);
    treemn[node]=min(treemn[left],treemn[right]);
    return;
}

int querymx(int node, int s, int f, int i, int j){
    if(i>f||j<s){return 0;}
    if(s>=i&&j>=f){return treemx[node];}
    int left= node<<1;
    int right= left+1;
    int mid=(s+f)/2;
    int p1=querymx(left,s,mid,i,j);
    int p2=querymx(right,mid+1,f,i,j);
    return max(p1,p2);
}
int querymn(int node, int s, int f, int i, int j){
    if(i>f||j<s){return MOD;}
    if(s>=i&&j>=f){return treemn[node];}
    int left= node<<1;
    int right= left+1;
    int mid=(s+f)/2;
    int p1=querymn(left,s,mid,i,j);
    int p2=querymn(right,mid+1,f,i,j);
    return min(p1,p2);
}

void solve(){
    cin >> n;

    for(int i=1 ; i<=n ; i++) {
        cin >> arr[i];
    }

    Build(1, 1, n);

    //return;

    bool yes = true;
    for(int i=1 ; i<=n-2 ; i++){
        int mx1 = querymx(1, 1, n, 1, i);
        if(mx1>arr[i+1]) continue;
        int left = i+1, right = n-1, ind = n+1, mid;

        while(left<=right){
            mid = (left+right)/2;
            int mn1 = querymn(1, 1, n, i+1, mid);
            int mx2 = querymx(1, 1, n, mid+1, n);

            if(mn1>mx1){
                left = mid+1;
            } else if(mx2>mx1){
                left = mid+1;
            } else if(mn1<mx1){
                right = mid-1;
            }else if(mx2<mx1){
                right = mid-1;
            }else {
                cout << "YES" << endl;
                cout << i << " " << mid-i << " " << n-mid << endl;
                ind = i;
                break;
            }
        }

        if(ind>n) continue;
        yes = false;
        break;

    }

    if(yes) cout << "NO" << endl;
    return;
}

int main()
{
    CIN

    //cout << "Fi Amanillah" << endl;

    int t = 1;
    cin >> t;

    while(t--){
        solve();
    }

    return 0;
}

