#include <bits/stdc++.h>
using namespace std;
int lf, rt, val, c[300010], pr[300010 * 4];
pair<int, int> tr[300010 * 4];
void init(int x, int st, int nd) {
  if (st == nd) {
    tr[x].first = c[st];
    tr[x].second = st;
    pr[x] = 0;
    return;
  }
  int md;
  md = (st + nd) / 2;
  pr[x] = 0;
  init(x * 2, st, md);
  init(x * 2 + 1, md + 1, nd);
  tr[x] = max(tr[x * 2], tr[x * 2 + 1]);
}
void updt(int x, int st, int nd) {
  if (st > rt || nd < lf) return;
  if (st >= lf && nd <= rt) {
    pr[x] += val;
    return;
  }
  int md;
  md = (st + nd) / 2;
  pr[x * 2] += pr[x];
  pr[x * 2 + 1] += pr[x];
  pr[x] = 0;
  updt(x * 2, st, md);
  updt(x * 2 + 1, md + 1, nd);
  if (tr[x * 2].first + pr[x * 2] >= tr[x * 2 + 1].first + pr[x * 2 + 1]) {
    tr[x].first = tr[x * 2].first + pr[x * 2];
    tr[x].second = tr[x * 2].second;
  } else {
    tr[x].first = tr[x * 2 + 1].first + pr[x * 2 + 1];
    tr[x].second = tr[x * 2 + 1].second;
  }
}
pair<int, int> qry(int x, int st, int nd) {
  if (st > rt || nd < lf) return make_pair(-1, -1);
  if (st >= lf && nd <= rt) return make_pair(tr[x].first + pr[x], tr[x].second);
  int md;
  pr[x * 2] += pr[x];
  pr[x * 2 + 1] += pr[x];
  pr[x] = 0;
  md = (st + nd) / 2;
  return max(qry(x * 2, st, md), qry(x * 2 + 1, md + 1, nd));
}
pair<int, int> a[300010];
int b[300010];
int main() {
  int n, x, x1, x2;
  while (cin >> n >> x1 >> x2) {
    for (int i = 0; i < n; ++i) {
      scanf("%d", &x);
      a[i] = make_pair(x, i + 1);
    }
    sort(a, a + n);
    for (int i = n - 1; i >= 0; --i) {
      b[i] = n - i;
    }
    for (int i = 0; i < n; ++i)
      c[i] = b[i] - (x2 + a[i].first - 1) / a[i].first;
    init(1, 0, n - 1);
    int tmp, pos;
    pair<int, int> tmp1;
    vector<int> ans1, ans2;
    bool l = 0;
    for (int i = 1; i <= n; ++i) {
      tmp = (x1 + i - 1) / i;
      if (tmp > a[n - 1].first) continue;
      pos = lower_bound(a, a + n, make_pair(tmp, -1)) - a;
      if (b[pos] >= i) {
        lf = 0;
        rt = pos - 1;
        val = -i;
        updt(1, 0, n - 1);
        lf = 0;
        rt = pos - 1;
        tmp1 = qry(1, 0, n - 1);
        if (tmp1.first >= 0) {
          l = 1;
          for (int j = pos; j < pos + i; ++j) {
            ans1.push_back(a[j].second);
          }
          for (int j = tmp1.second; j < n; ++j) {
            if (j >= pos && j < pos + i) continue;
            ans2.push_back(a[j].second);
          }
          break;
        }
        lf = pos + i;
        rt = n - 1;
        tmp1 = qry(1, 0, n - 1);
        if (tmp1.first >= 0) {
          l = 1;
          for (int j = pos; j < pos + i; ++j) {
            ans1.push_back(a[j].second);
          }
          for (int j = tmp1.second; j < n; ++j) {
            if (j >= pos && j < pos + i) continue;
            ans2.push_back(a[j].second);
          }
          break;
        }
        lf = 0;
        rt = pos - 1;
        val = i;
        updt(1, 0, n - 1);
      }
    }
    if (l) {
      cout << "Yes" << endl;
      cout << ans1.size() << " " << ans2.size() << endl;
      for (int i = 0; i < ans1.size(); ++i) printf("%d ", ans1[i]);
      cout << endl;
      for (int i = 0; i < ans2.size(); ++i) printf("%d ", ans2[i]);
      cout << endl;
    } else {
      cout << "No" << endl;
    }
  }
  return 0;
}
