#include <bits/stdc++.h>

using namespace std;

#define MP make_pair
#define PB push_back
#define REP(i, L, R) for (int i = L; i < (R); ++i)
#define SZ(x) (int)x.size()

using ll = long long;
using ld = long double;
using pi = pair<int, int>;
using pl = pair<ll, ll>;

template <typename T>
bool ckmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; }
template <typename T>
bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

void pm(int mask, int n)
{
    int cnt = 0;
    vector<int> ans;
    for (int i = 0; i < n; ++i)
    {
        if (mask & (1 << i))
        {
            ++cnt;
            ans.push_back(i + 1);
        }
    }
    cout << cnt << " ";
    for (int i = 0; i < cnt - 1; ++i)
    {
        cout << ans[i] << " ";
    }
    cout << ans[cnt - 1] << endl;
}

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

    if (n <= 20)
    {
        vector<vector<int>> b(200, vector<int>());
        for (int mask = 1; mask < (1 << n); ++mask)
        {
            int sum = 0;
            for (int i = 0; i < n; ++i)
            {
                if (mask & (1 << i))
                {
                    int r = a[i] % 200;
                    sum += r;
                    sum %= 200;
                }
            }
            b[sum % 200].push_back(mask);
        }

        for (int i = 0; i < 200; ++i)
        {
            if (SZ(b[i]) >= 2)
            {
                cout << "Yes" << endl;
                pm(b[i][0], n);
                pm(b[i][1], n);
                return;
            }
        }
        cout << "No" << endl;
        return;
    }
    else
    {
        vector<vector<pi>> ps(200, vector<pi>());
        for (int i = 0; i < n; ++i)
        {
            for (int j = i + 1; j < n; ++j)
            {
                int r = ((a[i] % 200) + (a[j] % 200)) % 200;
                ps[r].emplace_back(i, j);
            }
        }
        for (int i = 0; i < 200; ++i)
        {
            if (SZ(ps[i]) >= 2)
            {
                cout << "Yes" << endl;
                cout << 2 << " " << ps[i][0].first + 1 << " " << ps[i][0].second + 1 << endl;
                cout << 2 << " " << ps[i][1].first + 1 << " " << ps[i][1].second + 1 << endl;
                return;
            }
        }

        // should never reach here
        cout << "No" << endl;
        return;
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    while (T--)
    {
        solve();
    }
    return 0;
}

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include <queue>
#include <iomanip>

using namespace std;

typedef long long ll;

string yes = "Yes";
string no = "No";

vector<vector<ll>> stock(200, vector<ll>());
vector<vector<vector<ll>>> dp(200, vector<vector<ll>>());
vector<ll> aaa;
ll nowSum;
vector<ll> nowStackId;
ll n;
bool isFinished;


void Calcurate(ll index) {

	
	if (index <= n) {
		nowSum = (nowSum + aaa[index]) % 200;
		nowStackId.push_back(index);
		Calcurate(index + 1);

		if (isFinished) return;

		nowSum = (nowSum + 200 - aaa[index]) % 200;
		nowStackId.erase(nowStackId.begin() + nowStackId.size() - 1);
		Calcurate(index + 1);

		return;
	}

//	cout << nowSum << endl;

	//ジャッジ
	if (nowStackId.size() == 0) return;

	if (dp[nowSum].size() > 0) {
		//found
		cout << yes << endl;

		cout << dp[nowSum][0].size() << " ";
		for (ll i = 0; i < dp[nowSum][0].size(); i++) {
			cout << dp[nowSum][0][i] << " ";
		}
		cout << endl;

		cout << nowStackId.size() << " ";
		for (ll i = 0; i < nowStackId.size(); i++) {
			cout << nowStackId[i] << " ";
		}
		cout << endl;

		isFinished = true;
		return;

	}
	else {
		//notFound
		dp[nowSum].push_back(vector<ll>());

		for (ll i = 0; i < nowStackId.size(); i++) {
			dp[nowSum][0].push_back(nowStackId[i]);
		}
	}

}



int main()
{
	cin >> n;

	aaa.push_back(-10000);

	for (ll i = 1; i <= n; i++) {
		ll a;
		cin >> a;
		stock[a % 200].push_back(i);
		aaa.push_back(a % 200);
	}

	/*

	//2つダブってたら終了する
	for (ll i = 0; i < 200; i++) {
		if (stock[i].size() > 1) {
			cout << yes << endl;
			cout << 1 << " " << stock[i][0] << endl;
			cout << 1 << " " << stock[i][1] << endl;
			return 0;
		}
	}

	//0があったら終了
	if (stock[0].size() > 0) {
		for (ll i = 1; i < 200; i++) {
			if (stock[i].size() > 0) {
				ll ff = stock[0][0];
				ll ee = stock[i][0];
				if (ff > ee) swap(ff, ee);
				cout << yes << endl;
				cout << 1 << " " << stock[0][0] << endl;
				cout << 2 << " " << stock[0][0] << " " << stock[i][0] << endl;
				return 0;
			}
		}
	}
	*/
	/*
	//こっから全探査
	for (ll i = 0; i < 200; i++) {
		if (stock[i].size() > 0) {
			dp[i].push_back(vector<ll>());

		}
	}
*/
	isFinished = false;
	nowSum = 0;
	Calcurate(1);

	if (!isFinished) {
		cout << no << endl;
	}
}