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

#define INF (int)2e9
#define mod 1000000007
#define PI 3.141592653589793238
#define all(a) (a).begin(),(a).end()
#define rep(i,a,b) for(int i=a; i<b; ++i)

typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef pair<int, int> pi;
typedef vector<pi> vpi;

void solve(){

	int n;
	cin>>n;

	vector<int> a(n);
	rep(i,0,n){
		cin>>a[i];
	}

	n=min(n,8);
	vector<int> req(200, -1);

	rep(i,1,1<<n){
		ll r1=0;
		rep(j,0,n){
			if(i&(1<<j)){
				r1+=a[j];
			}
		}
		r1=r1%200;
		if(req[r1]!=-1){
			cout<<"YES\n";
			vector<int> s1, s2;
			rep(j,0,n){
				if(i&(1<<j)){
					s1.push_back(j+1);
				}
			}
			rep(j,0,n){
				if(req[r1]&(1<<j)){
					s2.push_back(j+1);
				}
			}
			cout<<s1.size()<<" ";
			for(int i: s1) cout<<i<<" ";
			cout<<'\n';
			cout<<s2.size()<<" ";
			for(int i: s2) cout<<i<<" ";
			cout<<'\n';
			return;
		}
		req[r1]=i;
		
	}

	cout<<"NO";


}

int main(){
	
	// 	freopen("input.txt", "r", stdin);
	// 	freopen("output.txt", "w", stdout);

	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.precision(10);
	int ts=1;
	//cin>>ts;
	for(int i=1; i<=ts; ++i){	
		// cout<<"Case #"<<i<<": ";
		solve();
		// cout<<'\n';
	}
	return 0;
	
}

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define pb push_back
const long double pi = acos(-1);

// g++ -std=c++17 -Wshadow -Wall -g -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG -o 

const int nax=205;
int dp[nax][nax][nax];
int n;
vector<int>a;
const int mod=200;
string ans1,ans2,base;
int solve(int i,int j,int diff,string s1,string s2){
 if(diff==0 && s1!=s2 && s1!=base && s2!=base){
//   cout<<i<<" "<<j<<"\n";
  ans1=s1,ans2=s2;
  return 1;
 }
 if(i==n || j==n)return 0;
 if(dp[i][j][diff]!=-1)return dp[i][j][diff];
 string t1=s1,t2=s2;
 t1[i]='1';
 t2[j]='1';
 dp[i][j][diff]=solve(i+1,j+1,(diff+a[i])%mod,t1,s2)|solve(i+1,j+1,((diff-a[j])%mod+mod)%mod,s1,t2);
 dp[i][j][diff]|=solve(i+1,j+1,diff,s1,s2)|solve(i+1,j+1,((diff+a[i]-a[j])%mod+mod)%mod,t1,t2);
 return dp[i][j][diff];
}

int main(){
 ios_base::sync_with_stdio(false);
 cin.tie(NULL);
 cin>>n;
 a.assign(n,0);
 memset(dp,-1,sizeof(dp));
 for(int i=0;i<n;i++){
  cin>>a[i];
  a[i]%=200;
 }
 string s1(n,'0');
 string s2(n,'0');
 base=string(n,'0');
 if(solve(0,0,0,s1,s2)){
  cout<<"Yes\n";
  vector<int>v1,v2;
  for(int i=0;i<n;i++){
   if(ans1[i]=='1')v1.pb(i);
  }
  for(int i=0;i<n;i++){
   if(ans2[i]=='1')v2.pb(i);
  }
  cout<<v1.size()<<" ";
  for(auto x:v1)cout<<x+1<<" ";
  cout<<"\n";
  cout<<v2.size()<<" ";
  for(auto x:v2)cout<<x+1<<" ";
  cout<<"\n";
 }
 else{
  cout<<"No\n";
 }
//  for(int i=0;i<40;i++){
//   for(int j=0;j<40;j++){
//    cout<<dp[i][j][diff]<<" ";
//   }
//   cout<<"\n";
//  }
 return 0;
}

// ALWAYS TAKE INITITAL MIN AS 2E18 AND INITITAL MAX AS -2E18
// ALWAYS TAKE INITIAL MAX AS 2E18 AND INITIAL MIN AS -2E18
// TAKE ALL INT VARIABLES AS LONG LONG INT
// READ WHEN WRITING BINARY SEARCH -
//    take care of the left and right limits while writing code for binary search -
//    l should be lower than min. possible ans, and r should be higher than max. possible ans
//    (MAX. POSSIBLE ANS CAN BE MORE THAN 1e18!!)