// #pragma comment(linker, "/stack:200000000")
// #pragma GCC optimize("Ofast,unroll-all-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>

#define ll long long
#define int ll
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define files(in, out) freopen(in, "r", stdin); freopen(out, "w", stdout)
#define rep(i, n) for (int i = 0; i < n; ++i)
#define all(a) a.begin(), a.end()
#define pii pair<int, int>
#define mp make_pair

using namespace std;

const int p = 31;
const int mod = 1e9 + 6;
const int max_n = 8e4 + 5;
const int log_n = 20;
const int inf = 1e9;
const long double pi = acos(-1);
const ld eps = 1e-11;
// const int len = 1600;

std::mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

int sz;
struct ST {
    vector<int> t;

    ST() {
        t.resize(4 * sz, inf);
    }

    void build(vector<int> &a, int v = 0, int vl = 0, int vr = sz) {
        if (vr - vl == 1) {
            if (vl < a.size())
                t[v] = a[vl];
            return;
        }
        int vm = (vl + vr) / 2;
        build(a, 2 * v + 1, vl, vm);
        build(a, 2 * v + 2, vm, vr);
        t[v] = min(t[2 * v + 1], t[2 * v + 2]);
    }

    int get(int lq, int rq, int v = 0, int vl = 0, int vr = sz){
        if (lq >= vr || vl >= rq) return inf;
        if (lq <= vl && vr <= rq) return t[v];
        int vm = (vl + vr) / 2;
        return min(get(lq, rq, 2 * v + 1, vl, vm), get(lq, rq, 2 * v + 2, vm, vr));
    }
};

void run() {
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i, n) {
        cin >> a[i];
    }
    sz = n;
    ST tree;
    tree.build(a);
    map<int, pii> mapik;

    int cur = 0;
    for (int i = n - 1; i >= 0; --i) {
        cur = max(cur, a[i]);
        if (mapik.count(cur) == 0) mapik[cur] = {i, i};
        else mapik[cur].ff = i;
    }

    cur = 0;
    rep(i, n - 2) {
        cur = max(a[i], cur);
        pii mbo = mapik[cur];
        mbo.ff--, mbo.ss--;
        mbo.ff = max(mbo.ff, i + 1);
        if (mbo.ff > mbo.ss) continue;
        int l = mbo.ff;
        int r = mbo.ss + 1;
        while (r - l > 1) {
            int mid = (l + r) / 2;
            int res = tree.get(i + 1, mid + 1);
            if (res >= cur) {
                l = mid;
            } else {
                r = mid;
            }
        }
        int res = tree.get(i + 1, l + 1);
        if (res == cur) {
            cout << "YES\n";
            cout << i + 1 << ' ' << l - i << ' ' << n - (i + 1) - (l - i) << '\n';
            return;
        }
    }

    cout << "NO\n";
}

signed main() {
#ifndef ONLINE_JUDGE
    files("input.txt", "output.txt");
#endif
    // files("optimize.in", "optimize.out");
    // srand(time(0));
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
        run();
    return 0;
}