#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,sse,sse2")
#include <bits/stdc++.h>
#define mem(a,x) memset(a,x,sizeof(a))
#define gi(x) scanf("%d",&x)
#define gi2(x,y) scanf("%d%d",&x,&y)
#define gll(x) scanf("%lld",&x)
#define gll2(x,y) scanf("%lld%lld",&x,&y)
using namespace std;
const double eps=1e-8; 
typedef long long ll;
const int MAXN=205;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
using namespace std;
int a[MAXN];

int dp[MAXN][40005];
vector< pair<int,int> >b[MAXN][40005];
vector<int> last[MAXN][40005];
int main(){
	
	int n;
	cin>>n;
	int sum=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i]%=200;
		sum+=a[i];
	}
	dp[0][0]=1;
	last[0][0].push_back(-1);
	for(int i=1;i<=n;i++){
		for(int j=0;j<200;j++){
			dp[i][j]=dp[i-1][j];
			if(dp[i-1][j]>=1&&last[i-1][j].size()){
				last[i][j].push_back(last[i-1][j][0]);
			}
			if(dp[i-1][(j-a[i]+200)%200]>=1){
				dp[i][j]=dp[i-1][(j-a[i]+200)%200];
				last[i][j].push_back(i);
			}
			if(j!=0&&last[i][j].size()>=2){
				stack<int>s[2];
				for(int k=0;k<2;k++){
					int t=last[i][j][k];
					int m=j;
					while(1){
						s[k].push(t);
						m-=a[t];
						m+=200;m%=200;
						if(last[t-1][m][0]!=-1)
							t=last[t-1][m][0];
						else{
							break;
						}
					}
				}
				printf("Yes\n");
				for(int k=0;k<2;k++){
					cout<<s[k].size();
					while(s[k].size()){
						cout<<" "<<s[k].top();
						s[k].pop();
					}
					cout<<endl;
				}
				return 0;
			}
		}
	}
	printf("No\n");
//	for(int i=1;i<=n;i++){
//		for(int j=0;j<=sum;j++){
//			if(dp[i][j]){
//				cout<<i<<' '<<j<<' '<<dp[i][j]<<endl;
//			}
//		}
//	}
	
	
	
	return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int N;
  cin >> N;
  vector<int> A(N);
  for (auto &&e : A) {
    cin >> e;
  }
  vector<vector<int>> X(200);
  for (int i = 0; i < N; i++) {
    X[A[i] % 200].emplace_back(i);
  }
  for (int i = 0; i < 200; i++) {
    if ((int)X[i].size() >= 2) {
      cout << "Yes" << '\n';
      cout << 1 << ' ' << X[i][0] + 1 << '\n';
      cout << 1 << ' ' << X[i][1] + 1 << '\n';
      return 0;
    }
  }
  vector<bitset<200>> Y(200);
  for (int i = 0; i < N; i++) {
    auto Z = Y;
    if (Y[A[i] % 200].any()) {
      cout << "Yes" << '\n';
      cout << 1 << ' ' << i + 1 << '\n';
      vector<int> c;
      for (int j = 0; j < N; j++) {
        if (Y[A[i] % 200][j]) c.emplace_back(j);
      }
      cout << c.size() << ' ';
      for (const auto &e : c) {
        cout << e + 1 << (&e == &c.back() ? '\n' : ' ');
      }
      return 0;
    }
    if (Y[0].any()) {
      cout << "Yes" << '\n';
      cout << 1 << ' ' << i + 1 << '\n';
      vector<int> c;
      for (int j = 0; j < N; j++) {
        if (Y[0][j] || i == j) c.emplace_back(j);
      }
      cout << c.size() << ' ';
      for (const auto &e : c) {
        cout << e + 1 << (&e == &c.back() ? '\n' : ' ');
      }
      return 0;
    }
    Z[A[i] % 200][i] = 1;
    for (int j = 0; j < 200; j++) {
      if (Y[j].none()) continue;
      if (Y[(j + A[i]) % 200].any()) {
        bitset<200> b = Y[(j + A[i]) % 200], c = Y[j];
        c[i] = 1;
        for (int k = 0; k < N; k++) {
          if (b[k] && c[k]) {
            b[k] = 0;
            c[k] = 0;
          }
        }
        if (b.any() && c.any()) {
          cout << "Yes" << '\n';
          vector<int> bb, cc;
          for (int k = 0; k < N; k++) {
            if (b[k]) bb.emplace_back(k);
            if (c[k]) cc.emplace_back(k);
          }
          cout << bb.size() << ' ';
          for (const auto &e : bb) {
            cout << e + 1 << (&e == &bb.back() ? '\n' : ' ');
          }
          cout << cc.size() << ' ';
          for (const auto &e : cc) {
            cout << e + 1 << (&e == &cc.back() ? '\n' : ' ');
          }
          return 0;
        }
      }
      Z[(j + A[i]) % 200] = Y[j];
      Z[(j + A[i]) % 200][i] = 1;
    }
    Y = Z;
  }
  cout << "No" << '\n';
  return 0;
}
