#include <bits/stdc++.h>

// #include <atcoder/all>
// using namespace atcoder;

using namespace std;
using ll = long long;

bool v_cmp(pair<int, vector<int>> &p, pair<int, vector<int>> &q) {
    return p.first < q.first;
}
// sort(v.begin(), v.end(), v_cmp); // small to large

int main() {
    ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    cin >> N;
    vector<int> A(N);
    for (int i = 0; i < N; i++) {
        cin >> A[i];
        A[i] %= 200;
    }

    vector<pair<int, vector<int>>> pairs;
    for (int bits = 0; bits < (1 << min(N, 8)); bits++) {
        bitset<8> bs(bits);
        int tmp = 0;
        vector<int> s;
        for (int i = 0; i < min(N, 8); i++) {
            if (bs[i]) {
                tmp += A[i];
                tmp %= 200;
                s.push_back(i + 1);
            }
        }
        if (s.size() != 0) pairs.push_back(make_pair(tmp, s));
    }
    sort(pairs.begin(), pairs.end(), v_cmp);

    for (int i = 0; i < pairs.size() - 1; i++) {
        if (pairs[i].first == pairs[i + 1].first) {
            cout << "Yes" << endl;
            cout << pairs[i].second.size();
            for (int o : pairs[i].second) cout << " " << o;
            cout << endl;

            cout << pairs[i + 1].second.size();
            for (int o : pairs[i + 1].second) cout << " " << o;
            cout << endl;
            return 0;
        }
    }

    cout << "No" << endl;

    return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define Pr pair<ll,ll>
#define Tp tuple<ll,ll,ll>
using Graph = vector<vector<int>>;

ll mod = 1000000007;

int main() {
    ll N; cin >> N;
    ll dp[N+1][200]; ll A[N];
    rep(i,200){
        rep(j,N+1) dp[j][i] = 0;
    }
    dp[0][0] = 1; ll k,l; bool found = false;
    rep(i,N){
        ll a; cin >> a;
        A[i] = a%200;
        rep(j,200){
            if(!found&&j!=0&&dp[i][j]>=2){
                k = i; l = j; found = true;
            }
            dp[i+1][j] += dp[i][j];
            dp[i+1][(j+A[i])%200] += dp[i][j];
        }
    }
    rep(j,200){
        if(!found&&j!=0&&dp[N][j]>=2){
            k = N; l = j; found = true;
        }
    }
    if(!found){
        if(dp[N][0]>=3){
            cout << "Yes" << endl;
            ll s=0,t=0;
            rep(i,N){
                if(s==0&&A[i]%200==0){
                    s = i+1;
                }
                else if(A[i]%200==0) t = i+1;
            }
            cout << 1 << " " << s << endl;
            cout << 1 << " " << t << endl;
            return 0;
        }
        cout << "No" << endl;
    }
    else{
        cout << "Yes" << endl;
        vector<int> aa,ab;
        ll res = l;
        for(int i=k;i>=1;i--){
            if(dp[i-1][(res+200-A[i-1])%200]>=1){
                res = (res+200-A[i-1])%200; aa.push_back(i);
            }
        }
        res = l;
        for(int i=k;i>=1;i--){
            if(dp[i-1][res]>=1){
                continue;
            }
            else{
                res = (res+200-A[i-1])%200; ab.push_back(i);
            }
        }
        reverse(aa.begin(),aa.end()); reverse(ab.begin(),ab.end());
        cout << aa.size() << " ";
        for(int x:aa) cout << x << " ";
        cout << endl;
        cout << ab.size() << " ";
        for(int x:ab) cout << x << " ";
        cout << endl;
    }
    //cout << ans << endl;
}