#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 2e5 + 10;
ll v[maxn], t[4 * maxn],  sufmx[maxn], n;
map<ll, vector<ll>> id, idmx;


void bld(ll node, ll tl, ll tr) {
    if (tl == tr) {
        t[node] = v[tl]; return;
    }
    ll m = (tl + tr) >> 1, left = node << 1, right = left | 1;
    bld(left, tl, m);
    bld(right, m + 1, tr);
    t[node] = min(t[left], t[right]);
}

ll qry(ll node, ll tl, ll tr, ll l, ll r) {
    if (tl > r || tr < l) return 1e16;
    if (l <= tl && tr <= r) return t[node];
    ll m = (tl + tr) >> 1, left = node << 1, right = left | 1;
    ll q1 = qry(left, tl, m, l, r);
    ll q2 = qry(right, m + 1, tr, l, r);
    return min(q1, q2);
}


ll go(vector<ll>& p, ll x) {
    auto it = upper_bound(p.begin(), p.end(), x);
    if (it == p.end()) return n + 1;
    return *it;
}
void solve() {
    id.clear();
    idmx.clear();
    cin >> n;
    for (ll i = 1; i <= n; i++) {
        cin >> v[i];
        id[v[i]].push_back(i);
    }
    bld(1, 1, n);
    sufmx[n] = v[n];
    for (ll i = n - 1; i >= 1; i--) sufmx[i] = max(sufmx[i + 1], v[i]);
    for (ll i = 1; i <= n; i++) idmx[sufmx[i]].push_back(i);
    ll x = -1, y = -1, z = -1, mx = 0;
    for (ll i = 1; i <= n; i++) {
        mx = max(v[i], mx);
        ll nxt = go(id[mx], i);
        if (nxt < n) {
            ll nxt2 = go(idmx[mx], nxt);
            if (nxt2 <= n) {
                ll cur = qry(1, 1, n, i + 1, nxt2 - 1);
                if (cur == mx) {
                    cout << "YES\n";
                    cout << i << ' ' << nxt2 - i - 1 << ' ' << n - nxt2 + 1 << '\n';
                    return;
                }

            }
        }
    }
    cout << "NO\n";


}


int main() {
    ios::sync_with_stdio(false); cin.tie(0);

    ll t; cin >> t; while(t--)

    solve();

}
