Problem: You are given an array a consisting of n integers.

Let min(l, r) be the minimum value among a_l, a_{l + 1}, …, a_r and max(l, r) be the maximum value among a_l, a_{l + 1}, …, a_r.

Your task is to choose three positive (greater than 0) integers x, y and z such that:

  * x + y + z = n; 
  * max(1, x) = min(x + 1, x + y) = max(x + y + 1, n). 



In other words, you have to split the array a into three consecutive non-empty parts that cover the whole array and the maximum in the first part equals the minimum in the second part and equals the maximum in the third part (or determine it is impossible to find such a partition).

Among all such triples (partitions), you can choose any.

You have to answer t independent test cases.

Input

The first line of the input contains one integer t (1 ≤ t ≤ 2 ⋅ 10^4) — the number of test cases. Then t test cases follow.

The first line of the test case contains one integer n (3 ≤ n ≤ 2 ⋅ 10^5) — the length of a.

The second line of the test case contains n integers a_1, a_2, …, a_n (1 ≤ a_i ≤ 10^9), where a_i is the i-th element of a.

It is guaranteed that the sum of n does not exceed 2 ⋅ 10^5 (∑ n ≤ 2 ⋅ 10^5).

Output

For each test case, print the answer: NO in the only line if there is no such partition of a that satisfies the conditions from the problem statement. Otherwise, print YES in the first line and three integers x, y and z (x + y + z = n) in the second line.

If there are several answers, you can print any.

Example

Input


6
11
1 2 3 3 3 4 4 3 4 2 1
8
2 9 1 7 3 9 4 1
9
2 1 4 2 4 3 3 1 2
7
4 2 1 1 4 1 4
5
1 1 1 1 1
7
4 3 4 3 3 3 4


Output


YES
6 1 4
NO
YES
2 5 2
YES
4 1 2
YES
1 1 3
YES
2 1 4

Solution (in CPP):

Solution:
//aro ekti gojamil submission karon ami ekhono kono idea paitecina
#include<bits/stdc++.h>

///for ordered set///
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/trie_policy.hpp>
///for ordered set///

using namespace std;

///for ordered set///
//using namespace __gnu_pbds;
//typedef tree< long long int , null_type, less_equal<long long int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
///for ordered set///

///Compiler Optimizer///
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
///Compiler Optimizer///

typedef long long           ll;
typedef unsigned long long  ull;

#define sf                  scanf
#define pf                  printf
#define pb                  push_back
#define ppb                 pop_back
#define MP                  make_pair
#define PF                  first
#define PS                  second
#define si(n)               scanf("%d",&n)
#define sii(x,y)            scanf("%d %d",&x,&y)
#define siii(x,y,z)         scanf("%d %d %d",&x,&y,&z)
#define sl(n)               scanf("%lld",&n)
#define sll(x,y)            scanf("%lld %lld",&x,&y)
#define slll(x,y,z)         scanf("%lld %lld %lld",&x,&y,&z)
#define FOR(i,x,y)          for(int i=x;i<=y;i++)
#define RFOR(i,x,y)         for(int i=x;i>=y;i--)
#define CLR(arr,val)        memset(arr,val,sizeof arr);
#define vout(v,ind)         for(int vind=0;vind<v.size();vind++){ cout<<v[vind]; if(vind<v.size()-1) cout<<' '; else cout<<endl;}
#define arrout(arr,i,x,y)   for(int i=x;i<=y;i++){ cout<<arr[i]; if(i<y) cout<<' '; else cout<<endl;}
#define all(v)              v.begin(),v.end()
#define rall(v)             v.rbegin(),v.rend()
#define TCL(test,t)         for(test=1;test<=t;test++)
#define READ()              freopen("input.txt", "r", stdin)
#define WRITE()             freopen("output.txt", "w", stdout)
#define fastIO()            {ios_base::sync_with_stdio(false); cin.tie(NULL);}
#define MAXN                200005
#define MAXP                2005
#define MOD                 1000000007
#define PI                  acos(-1)

#ifdef ELDUIVEL
    #define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template < typename Arg1 >
    void __f(const char* name, Arg1&& arg1){
        cout << name << " = " << arg1 << std::endl;
    }
    template < typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names, ',');
        cout.write(names, comma - names) << " = " << arg1 <<" | ";
        __f(comma+1, args...);
    }
#else
    #define debug(...)
#endif

int ROW[]={+0, +0, -1, +1};
int COL[]={+1, -1, +0, +0};

int X[]={+0,+0,+1,-1,-1,+1,-1,+1};   // Kings Move
int Y[]={-1,+1,+0,+0,+1,+1,-1,-1};  // Kings Move

int KX[]={-2, -2, -1, -1,  1,  1,  2,  2};  // Knights Move
int KY[]={-1,  1, -2,  2, -2,  2, -1,  1}; // Knights Move

int treemx[4*MAXN],treemn[4*MAXN], arr[MAXN];

void buildtree(int node,int s, int f){
    if(s==f){
        treemx[node]=arr[f];
        treemn[node]=arr[f];
        return;
    }
    int left=node<<1;
    int right=left+1;
    int mid=(s+f)/2;
    buildtree(left,s,mid);
    buildtree(right,mid+1,f);
    treemx[node]=max(treemx[left],treemx[right]);
    treemn[node]=min(treemn[left],treemn[right]);
}

int querymx(int node, int s, int f, int i, int j){
    if(i>f||j<s){return 0;}
    if(s>=i&&j>=f){return treemx[node];}
    int left= node<<1;
    int right= left+1;
    int mid=(s+f)/2;
    int p1=querymx(left,s,mid,i,j);
    int p2=querymx(right,mid+1,f,i,j);
    return max(p1,p2);
}
int querymn(int node, int s, int f, int i, int j){
    if(i>f||j<s){return MOD;}
    if(s>=i&&j>=f){return treemn[node];}
    int left= node<<1;
    int right= left+1;
    int mid=(s+f)/2;
    int p1=querymn(left,s,mid,i,j);
    int p2=querymn(right,mid+1,f,i,j);
    return min(p1,p2);
}


int main(){
    #ifdef ELDUIVEL
        clock_t tStart = clock();
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
    int t; si(t);
    while(t--){
        int n; si(n);
        FOR(i,1,n) si(arr[i]);
        buildtree(1,1,n);
        bool flag=true;
        FOR(i,1,n-2){
            int mx1=querymx(1,1,n,1,i);
            if(mx1>arr[i+1]) continue;
            int low=i+1,high=n-1,mid,ind=n+1;
            while(low<=high){
                mid=(low+high)/2;
                int mn1=querymn(1,1,n,i+1,mid);
                int mx2=querymx(1,1,n,mid+1,n);
                if(mn1>mx1){
                    low=mid+1;
                } else if(mn1<mx1){
                    high=mid-1;
                } else if(mx2>mx1){
                    low=mid+1;
                } else if(mx2<mx1){
                    high=mid-1;
                } else{
                    cout<<"YES"<<endl; ind=i;
                    cout<<i<<' '<<mid-i<<' '<<n-mid<<endl;
                    break;
                }
            }
            if(ind>n) continue;
            flag=false;
            break;
        }
        if(flag) cout<<"NO"<<endl;
    }
    #ifdef ELDUIVEL
        fprintf(stderr, "\n>> Runtime: %.10fs\n", (double) (clock() - tStart) / CLOCKS_PER_SEC);
    #endif
    return 0;
}