#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define endl '\n'
typedef pair<int, int> P;
typedef long long ll;

int dp[300][300];
int n;
vector<int> bucket;

bool valid(vector<int> x, vector<int> y)
{
    if (x.size() == 0 || y.size() == 0)
    {
        return false;
    }
    if (x.size() != y.size())
    {
        return true;
    }
    rep(i, x.size())
    {
        if (x[i] != y[i])
        {
            return true;
        }
    }
    return false;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    rep(i, n)
    {
        int t;
        cin >> t;
        bucket.push_back(t % 200);
    }
    dp[0][0] = 1;
    rep(i, n)
    {
        rep(j, 200)
        {
            if (dp[i][j] > 0)
            {
                dp[i + 1][j] += dp[i][j];
                dp[i + 1][(j + bucket[i]) % 200] += dp[i][j];
            }
        }
    }
    while (true)
    {
        int s = 0, t = 0;
        bool cant = true;
        rep(i, n + 1)
        {
            rep(j, 200)
            {
                if (j == 0 && dp[i][j] > 2)
                {
                    s = i;
                    t = j;
                    cant = false;
                }
                if (j > 0 && dp[i][j] > 1)
                {
                    s = i;
                    t = j;
                    cant = false;
                }
            }
        }
        if (cant)
        {
            cout << "No" << endl;
            return 0;
        }
        int i = s;
        int j = t;
        vector<int> x;
        while (i != 0 && j != 0)
        {
            if (dp[i - 1][(j + 200 - bucket[i - 1]) % 200] > 0)
            {
                j = (j + 200 - bucket[i - 1]) % 200;
                x.push_back(i);
                i--;
            }
            else
            {
                i--;
            }
        }
        i = s;
        j = t;
        vector<int> y;
        while (i != 0 && j != 0)
        {
            if (y.empty() && dp[i - 1][j] > 1)
            {
                i--;
            }
            else if (y.empty() && dp[i - 1][(j + 200 - bucket[i - 1]) % 200] > 1)
            {
                j = (j + 200 - bucket[i - 1]) % 200;
                y.push_back(i);
                i--;
            }
            else if (dp[i - 1][j] > 0)
            {
                i--;
            }
            else
            {
                j = (j + 200 - bucket[i - 1]) % 200;
                y.push_back(i);
                i--;
            }
        }
        if (valid(x, y))
        {
            reverse(x.begin(), x.end());
            reverse(y.begin(), y.end());
            cout << "Yes" << endl;
            cout << x.size();
            for (auto xi : x)
            {
                cout << ' ' << xi;
            }
            cout << endl;
            cout << y.size();
            for (auto yi : y)
            {
                cout << ' ' << yi;
            }
            cout << endl;
            return 0;
        }
        else
        {
            dp[s][t] = 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;
}
