
#include<iostream>

int main(){
	int i,j,bit;
	int n,a,b;	
	int num[8]={};
	int can[200]={};
	int count=0;
	std::cin>>n;
	if(n>8)n=8;
	for(i=0;i<n;i++){
		std::cin>>a;
		num[i]=a%200;	
	}
	for(bit=1;bit<(1<<n);++bit){
		b=0;
		for(i=0;i<n;i++){
			if(bit&(1<<i)){
				b+=num[i];
			}
		}
		b=b%200;
		if(can[b])break;
		else can[b]=bit;
	}
	if(bit==(1<<n))std::cout<<"No"<<std::endl;
	else{
	std::cout<<"Yes"<<std::endl;
	count=0;
	for(i=0;i<n;i++){
		if(bit&(1<<i))count++;
	}
	std::cout<<count<<" ";
	for(i=0;i<n;i++){
		if(bit&(1<<i))std::cout<<i+1<<" ";
	}
	std::cout<<std::endl;
	count=0;
	for(i=0;i<n;i++){
		if(can[b]&(1<<i))count++;
	}
	std::cout<<count<<" ";
	for(i=0;i<n;i++){
		if(can[b]&(1<<i))std::cout<<i+1<<" ";
	}
	std::cout<<std::endl;
	}
}
//雪花飄飄北風嘯嘯
//天地一片蒼茫

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define ll long long
#define ii pair<ll,ll>
#define iii pair<ii,ll>
#define fi first
#define se second
#define endl '\n'
#define debug(x) cout << #x << " is " << x << endl

#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define lb lower_bound
#define ub upper_bound

#define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()

#define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
//change less to less_equal for non distinct pbds, but erase will bug

mt19937 rng(chrono::system_clock::now().time_since_epoch().count());

int n;
int arr[205];

bool memo[205][205];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin.exceptions(ios::badbit | ios::failbit);
	
	cin>>n;
	rep(x,0,n){
		cin>>arr[x];
		arr[x]%=200;
	}
	
	memo[0][0]=true;
	
	rep(x,0,n){
		rep(y,0,200) if (memo[x][y]){
			memo[x+1][(y+arr[x])%200]=true;
			memo[x+1][y]=true;
			memo[x+1][(y-arr[x]+200)%200]=true;
		}
	}
	
	vector<int> add;
	vector<int> minus;
	
	int py=0;
	rep(x,n,0){
		if (sz(add) && memo[x][(py+arr[x])%200]){
			minus.pub(x);
			py=(py+arr[x])%200;
		}
		else if (sz(minus) && memo[x][(py-arr[x]+200)%200]){
			add.pub(x);
			py=(py-arr[x]+200)%200;
		}
		else if (memo[x][(py+arr[x])%200]){
			minus.pub(x);
			py=(py+arr[x])%200;
		}
		else if (memo[x][(py-arr[x]+200)%200]){
			add.pub(x);
			py=(py-arr[x]+200)%200;
		}
	}
	
	if (sz(add)==0 && sz(minus)==0){
		cout<<"No"<<endl;
		return 0;
	}
	if (sz(add)==n && sz(minus)==0){
		cout<<"No"<<endl;
		return 0;
	}
	if (sz(add)==0 && sz(minus)==n){
		cout<<"No"<<endl;
		return 0;
	}
	
	set<int> s;
	rep(x,0,n) s.insert(x);
	for (auto &it:add) s.erase(it);
	for (auto &it:minus) s.erase(it);
	
	if (!s.empty()) add.pub(*s.begin()),minus.pub(*s.begin());
	
	cout<<"Yes"<<endl;
	
	sort(all(add));
	sort(all(minus));
	
	cout<<sz(add)<<" "; for (auto &it:add) cout<<it+1<<" "; cout<<endl;
	cout<<sz(minus)<<" "; for (auto &it:minus) cout<<it+1<<" "; cout<<endl;
}
