#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int nax = 2e5+5;
const int INF = 2e9;
    
vector<pair<int, int>> arr(nax);
unordered_map<int, int> occ;
vector<bool> active(nax);

class DSU {
    vector<int> p, sz;
public:
    DSU(int n) {
        p.assign(n, 0);
        iota(p.begin(), p.end(), 0);
        sz.assign(n, 1);
    }
    int par(int x) {
        return p[x] == x ? x : p[x] = par(p[x]);
    }
    bool IsSameSet(int x, int y) {
        return par(x) == par(y);
    }
    void merge(int a, int b) {
        int x = par(a), y = par(b);
        if (x != y) {
            if (sz[x] > sz[y]) {
                swap(x, y);
            }
            p[x] = y;
            sz[y] += sz[x];
        
        }
    }
    int getsize(int x) {
        return sz[par(x)];
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int t, n;
    cin >> t;
    int origt = 20000000;
    int count = 0;
    while (t--) {
        count++;
        cin >> n;
        occ.clear();
        for (int i = 0; i < n; i++) {
            active[i] = false;
            cin >> arr[i].first;
            arr[i].second = i;
            occ[arr[i].first]++;
        }
        if (count == 54311111) {
            cout << n << '\n';
            for (int i = 0; i < n; i++) cout << arr[i].first;
        }
        sort(arr.begin(), arr.begin() + n, greater<pair<int, int>>());
        if (occ[arr[0].first] >= 3) {
            int x = arr[1].second;
            if (origt != 20000) {
                cout << "YES\n";
                cout << x << ' ' << 1 << ' ' << n - x - 1 << '\n';
            }
        }
        else {
            DSU s(n);
            int l = INF, r = -1;
            bool ansfound = false;
            for (int i = 0; i < n; i++) {
                int num = arr[i].first, ind = arr[i].second;
                vector<int> temp;
                for (int j = 0; j < occ[num]; j++) {
                    temp.push_back(arr[j + i].second);
                }
                i += occ[num] - 1;
                int nl = l, nr = r, lessthanl = 0, greaterthanr = 0;
                bool lminusone = false, rplusone = false;
                bool mid = false;
                for (auto x : temp) {
                    active[x] = true;
                    nl = min(nl, x);
                    nr = max(nr, x);
                    if (x < l) lessthanl++;
                    if (x > r) greaterthanr++;
                    if (x == l - 1) lminusone = true;
                    if (x == r + 1) rplusone = true;
                    if (x > l && x < r) mid = true;
                    if (x > 0 && active[x - 1]) {
                        s.merge(x, x - 1);
                    }
                    if (x + 1 < n && active[x + 1]) {
                        s.merge(x, x + 1);
                    }
                }
                //cout << "prev l, r " << l << ' ' << r << "\n";
                //cout << "new l, r " << nl << ' ' << nr << "\n";
                if (l != INF) {
                    if (s.getsize((l+r)/2) >= r - l + 1) {
                        if (lessthanl > 1 && lminusone && greaterthanr) {
                            l--;
                            if (s.getsize((l + r) / 2) < r - l + 1) {
                                l = nl, r = nr;
                                continue;
                            }
                        }
                        else if (lessthanl && rplusone && greaterthanr > 1) {
                            r++;
                            if (s.getsize((l + r) / 2) < r - l + 1) {
                                l = nl, r = nr;
                                continue;
                            }
                        }
                        else if (lessthanl && mid && greaterthanr) {
                            
                        }
                        else {
                            l = nl, r = nr;
                            continue;
                        }
                        if (origt != 20000) {
                            cout << "YES\n";
                            cout << l << ' ' << r - l + 1 << ' ' << n - r - 1 << '\n';
                        }
                        ansfound = true;
                        break;
                    }
                }
                l = nl, r = nr;
            }
            if (!ansfound && origt != 20000) cout << "NO\n";
        }
    }
    return 0;
}