/**
    __author__ : FireGhost
    problems_ID: 1454F
*/

#include <bits/stdc++.h>

using namespace std;

#define mp 					make_pair
#define pb 					push_back
#define fi 					first
#define se 					second
#define all(x)				        x.begin(), x.end()
#define endl				        "\n"
#define _itr				        ::iterator

typedef long long       	                ll;
typedef unsigned long long 	                ull;
typedef vector<int> 		                vi;
typedef pair<int, int>		                pii;

const int N = 1e5 + 3;
const int INF = INT_MAX;
const int NEINF = INT_MIN;
const int MOD = 1e9 + 7;

void Solve()
{
    /// Reading the input
    int n; cin >> n;
    vector <int> a(n + 1);
    for (int i = 1; i <= n; ++i) cin >> a[i];
    /// Maintaining 2 arrays that keep the longest subarray, where a[i] is the
    /// minimum of [min_left[i], min_right[i]].
    /// Also maintaining maximum prefix and maximum suffix arrays.
    deque <int> mi;
    vector <int> min_left(n + 1), min_right(n + 1), pref(n + 1), suff(n + 1);
    pref[1] = a[1]; suff[n] = a[n];
    for (int i = 1; i <= n; ++i)
    {
        while (mi.size() && a[mi.back()] >= a[i]) mi.pop_back();
        if (mi.size() == 0) min_left[i] = 1;
        else min_left[i] = mi.back() + 1;
        mi.push_back(i);
    }
    for (int i = 2; i <= n; ++i)
        pref[i] = max(pref[i - 1], a[i]);
    mi.clear();
    for (int i = n; i >= 1; --i)
    {
        while (mi.size() && a[mi.back()] >= a[i]) mi.pop_back();
        if (mi.size() == 0) min_right[i] = n;
        else min_right[i] = mi.back() - 1;
        mi.push_back(i);
    }
    for (int i = n - 1; i >= 1; --i)
        suff[i] = max(suff[i + 1], a[i]);
    /// Binary search for x and y
    for (int i = 1; i <= n; ++i)
    {
        int x = -1, y = -1;
        int v = a[i];
        int lo = min_left[i] - 1, hi = i - 1;
        while (lo <= hi)
        {
            int mid = (lo + hi) >> 1;
            if (pref[mid] == v)
            {
                x = mid;
                lo = mid + 1;
            }
            else if (pref[mid] > v) hi = mid - 1;
            else lo = mid + 1;
        }
        lo = i + 1, hi = min_right[i] + 1;
        while (lo <= hi)
        {
            int mid = (lo + hi) >> 1;
            if (suff[mid] == v)
            {
                y = mid;
                hi = mid - 1;
            }
            else if (suff[mid] > v) lo = mid + 1;
            else hi = mid - 1;
        }
        if (x == -1 || y == -1) continue;
        cout << "YES" << "\n";
        cout << x << " " << y - x - 1 << " " << n - y + 1 << "\n";
        return;
    }
    cout << "NO" << "\n";
}

int main()
{
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int t; cin >> t;
    while (t--)
        Solve();
    return 0;
}
