// 解説を参考にコーディング
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vii = vector<vector<int>>;
using vl = vector<long long>;
using vll = vector<vector<long long>>;
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define len(a) (int)a.size()
#define all(a) a.begin(), a.end()

const int INF32 = 1 << 30;
const long long INF64 = 1LL << 60;
const double PI = acos(-1);

/* 1次元ベクトルをスペースでつなぎ、改行をつけて出力 
   vi, vl, list<int>, list<ll>に対応  */
template<class T> string print_elements(T a) {
    string str = "";
    for (auto itr = a.begin(); itr != a.end(); ++itr) {
        str += to_string(*itr) + ' ';
    }
    str.pop_back();  // 最後の空白を削除
    str += '\n';
    return str;
}

int main() {
    int N;
    cin >> N;
    vl A(N);
    rep(i, N) cin >> A[i];

    map<int, int> m;
    bool result = false;
    int ans1, ans2;
    int N2 = min(8, N);
    rep(i, (1 << N2)) {
        if (i == 0) continue;
        int val = 0;
        rep(j, N2) {
            if ((i >> j) & 1) {
                val += A[j] % 200;
            }
        }
        val %= 200;
        if (!m.count(val)) {
            m[val] = i;
        }
        else {
            result = true;
            ans1 = m.at(val);
            ans2 = i;
            break;
        }
    }
    vi v1, v2;
    if (result) {
        string str1 = to_string(__builtin_popcount(ans1)) + ' ';
        string str2 = to_string(__builtin_popcount(ans2)) + ' ';
        cout << "Yes" << endl;
        rep(i, 7) {
            if ((ans1 >> i) & 1) {
                v1.push_back(i + 1);
            }
            if ((ans2 >> i) & 1) {
                v2.push_back(i + 1);
            }
        }
        str1 += print_elements(v1);
        str2 += print_elements(v2);
        cout << str1 << str2;
    }
    else {
        cout << "No" << endl;
    }
}

#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
using ull = unsigned long long int;

template <class T>
inline bool chmin(T &a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template <class T>
inline bool chmax(T &a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

int main() {
    int N;
    cin >> N;
    vector<ll> A(N);
    for (auto &a : A) cin >> a, a %= 200;

    int cnt = min(N, 8);
    vector<int> v(200, -1);
    for (int bit = 1; bit < (1 << cnt); bit++) {
        int b = 0;
        for (int i = 0; i < cnt; i++) {
            if (bit & (1 << i)) b += A[i];
        }
        b %= 200;
        if (v[b] == -1)
            v[b] = bit;
        else {
            vector<int> B, C;
            for (int i = 0; i < cnt; i++) {
                if (bit & (1 << i)) B.push_back(i + 1);
                if (v[b] & (1 << i)) C.push_back(i + 1);
            }
            cout << "Yes" << endl;
            cout << B.size() << " ";
            for (auto i : B) cout << i << " ";
            cout << endl << C.size() << " ";
            for (auto i : C) cout << i << " ";
            cout << endl;
            return 0;
        }
    }
    cout << "No" << endl;
}
