// Premature optimization is the root of all evil in programming - Knuth.

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;
const int INF = 2e9;
int suff_max[N];
int a[N];
struct seg_tree {
    vector<int> tree;
    seg_tree(int _n) {
        _n += 2;
        tree.resize(_n << 2);
    }
    int combine(int x, int y)  {
        return min(x, y);
    }
    void build(int l, int r, int node) {
        if (l == r) {
            tree[node] = a[l];
            return;
        }
        int mid = l + r >> 1, lc = node + node, rc = 1 + lc;
        build(l, mid, lc);
        build(mid + 1, r, rc);
        tree[node] = combine(tree[lc], tree[rc]);
    }
    int query(int l, int r, int ql, int qr, int node) {
        if (qr < l || r < ql)
            return INF;
        if (ql <= l and r <= qr) {
            return tree[node];
        }
        int mid = l + r >> 1, lc = node + node, rc = 1 + lc;
        return combine(query(l, mid, ql, qr, lc), query(mid + 1, r, ql, qr, rc));
    }
};

void solve() {
    int n;
    cin >> n;
    seg_tree ins(n);
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }
    ins.build(1, n, 1);
    map<int, vector<int>> pos;
    suff_max[n + 1] = 0;
    for (int i = n; i > 0; --i) {
        suff_max[i] = max(suff_max[i + 1], a[i]);
        pos[suff_max[i]].push_back(i);
    }
    int pref_max = 0;
    for (int i = 1; i + 2 <= n; ++i) {
        pos[suff_max[i]].pop_back();
        pref_max = max(pref_max, a[i]);
        if (pos[pref_max].empty()) {
            continue;
        }
        int lo = i + 1, hi = pos[pref_max][0] - 1;
        int res = -1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            int range_min = ins.query(1, n, i + 1, mid, 1);
            if (range_min > pref_max) {
                lo = mid + 1;
            }
            else if (range_min < pref_max) {
                hi = mid - 1;
            }
            else {
                res = mid;
                lo = mid + 1;
            }
        }
        if (res != -1 and ins.query(1, n, i + 1, res, 1) == pref_max && suff_max[res + 1] == pref_max) {
            cout << "YES" << '\n';
            cout << i << ' ' << res - i << ' ' << n - res << '\n';
            return;
        }
    }
    cout << "NO" << '\n';
}

// #define single_test

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int t = 1;
    #ifndef single_test
        cin >> t;
    #endif
    for (int i = 1; i <= t; ++i) {
        // cout << "Case #" << i << ": ";
        solve();
    }
    return 0;
}