#include <bits/stdc++.h>

using namespace std;

#define PI 3.14159265358979323846264338327950L

int main(void){

    int N;
    long long tmp,sumB,sumC;
    cin>>N;

    vector<long long> A(N),B,C,num(N,0);

    for(int i=0;i<N;i++){
        cin>>tmp;
        A[i]=tmp%200;
    }

    bool flg=false;
    for(long long i=0;i<min(pow(3,N),1e5);i++){
        B.clear();sumB=0;
        C.clear();sumC=0;
        for(int j=0;j<N;j++){
            if(num[j]==1){
                sumB+=A[j];
                sumB = sumB%200;
                B.push_back(j+1);
            }else if(num[j] ==2){
                sumC += A[j];
                sumC = sumC%200;
                C.push_back(j+1);
            }
        }

        if(sumB == sumC && B.size() >0 && C.size()>0){
            flg=true;
            break;
        }

        num[0]++;
        for(int j=0;j<N-1;j++){
            if(num[j]>=3){
                num[j+1]++;
                num[j]=num[j]-3;
            }
        }
    }

    if(flg){
        cout<<"Yes"<<endl;
        cout<<B.size()<<" ";
        for(int i=0;i<B.size();i++){
            cout<<B[i]<<" ";
        }
        cout<<endl;

        cout<<C.size()<<" ";
        for(int i=0;i<C.size();i++){
            cout<<C[i]<<" ";
        }
        cout<<endl;
    }else{
        cout<<"No"<<endl;
    }


    return 0;
}


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

#define max(a, b) (a < b ? b : a) 
#define min(a, b) ((a > b) ? b : a) 
#define mem(a,b) memset(a,(b),sizeof(a))
#define for0(a, c) for (int(a) = 0; (a) < (c); (a)++) 
#define forc(a, b, c) for (int(a) = (b); (a) <= (c); (a)++) 
#define forr(a, b, c) for (int(a) = (b); (a) >= (c); (a)--)
#define all(x) (x).begin(), (x).end() 
#define rall(x) (x).rbegin(), (x).rend() 
#define sz(a) int((a).size())

#define disp(a) cout<<#a<<" "<<a<<"\n";
#define show(vec) cout<<#vec<<"\n"; for(auto v : vec) cout<<v<<" "; cout<<"\n";
#define showi(vec) for0(i,sz(vec)) cout<<"i: "<<i<<" "<<#vec<<"["<<i<<"]: "<<vec[i]<<"\n";

#define bs(num, v) binary_search((v).begin(), (v).end(), (num))
#define ub(num, v) upper_bound((v).begin(), (v).end(), (num))
#define lb(num, v) lower_bound((v).begin(), (v).end(), (num))

#define INF 1000000000000000003 
#define mod 1e9 + 7 

// Common memset settings
//memset(memo, -1, sizeof memo); // initialize DP memoization table with -1
//memset(arr, 0, sizeof arr); // to clear array of integers

// Common remainder formulaes
// (x+y)%m = ((x%m) + (y%m))%m
// (x.y)%m = ((x%m) . (y%m))%m
// (x-y)%m = ((x%m) - (y%m) + m)%m

typedef long long ll; 
typedef long double ld;
typedef vector<long long> vll;
typedef vector<pair<ll,ll>> vpll; 
typedef pair<ll, ll> pll; 

#define F first 
#define S second 
#define PB push_back 
#define POB pop_back 
#define MP make_pair 

void solve(){
	ll n; cin>>n;
	vll a(n);
	for0(i,n) cin>>a[i];

	// logic is if n>=8 then number of subsets = 2^8-1 > 200
	// Since the different subset should have sum % 200 to be equal their values
	// have 200 possibilities i.e. [0,200]. For n>=8 we have more than 200 subset so
	// it is obv that 2 or more would have the same value. For n<=8 brute force

	ll cnt = min(n,8);
	vector<vector<ll>> stored(200, vector<ll>(0));
	// finding all combinations using bitmasks
	for(ll i=1;i<(1<<cnt);i++){
		ll sum = 0;	// stores the sum % 200 of the current bitmask subset
		vector<ll> s; // stores the indices of the current bitmask subset
		for(ll j=0;j<cnt;j++){
			if(i&(1<<j)){
				s.push_back(j+1);
				sum += a[j]; 
				sum %= 200;
			}
		}

		if(stored[sum].size()!=0){
			// this sum is previously reached
			cout<<"YES\n";
			cout<<stored[sum].size()<<" ";
			for(auto x : stored[sum]){
				cout<<x<<" ";
			} cout<<"\n";
			cout<<s.size()<<" ";
			for(auto x : s){
				cout<<x<<" ";
			} cout<<"\n";
			return;
		} else {
			stored[sum] = s;
		}
	}

	cout<<"NO\n";

}

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

	#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
	#endif

	int T = 1;  while(T--)solve();
	return 0; 
}