#include <bits/stdc++.h>
using namespace std;
const int tinf = (int)1e9 + 7;
const long long inf = (long long)1e18 + 7;
const int N = 3e5 + 5;
const long long M = 1e9 + 7;
map<int, int> m;
int t[N * 4];
void update(int v, int tl, int tr, int pos, int val) {
  if (tl == tr) {
    t[v] += val;
  } else {
    int tm = (tl + tr) / 2;
    if (pos <= tm) {
      update(v * 2, tl, tm, pos, val);
    } else {
      update(v * 2 + 1, tm + 1, tr, pos, val);
    }
    t[v] = t[v * 2] + t[v * 2 + 1];
  }
}
int res(int v, int tl, int tr, int l, int r) {
  if (l > r) {
    return 0;
  }
  if (tl == l && tr == r) {
    return t[v];
  }
  int tm = (tl + tr) / 2;
  return res(v * 2, tl, tm, l, min(tm, r)) +
         res(v * 2 + 1, tm + 1, tr, max(tm + 1, l), r);
}
int main() {
  {
    ios ::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
  }
  int n, x1, x2, e1 = 0;
  cin >> n >> x1 >> x2;
  if (x1 < x2) {
    swap(x1, x2);
    e1 = 1;
  }
  set<int> v;
  v.insert(x1);
  v.insert(x2);
  pair<int, int> c[n];
  for (int i = 0; i < n; i++) {
    cin >> c[i].first;
    v.insert(c[i].first);
    c[i].second = i;
  }
  sort(c, c + n);
  int sz = 0;
  for (auto j : v) {
    if (!m.count(j)) {
      m[j] = sz++;
    }
  }
  for (int i = 0; i < n; i++) {
    update(1, 0, N - 1, m[c[i].first], 1);
  }
  int e = 0;
  vector<int> ans1, ans2;
  for (int i = 1; i <= n; i++) {
    int now = (x1 / i) + (x1 % i != 0);
    set<int>::iterator it = v.lower_bound(now);
    int metka = m[*it];
    if (*it < now) {
      break;
    }
    int res1 = res(1, 0, N - 1, metka, N - 1);
    if (res1 >= i) {
      e = 1;
      for (int j = 0; j < n; j++) {
        if (c[j].first >= now) {
          for (int z = j; z < j + i; z++) {
            update(1, 0, N - 1, m[c[z].first], -1);
            ans1.push_back(c[z].second + 1);
            c[z].second = -1;
          }
          break;
        }
      }
      break;
    }
  }
  if (!e) {
    cout << "No";
    return 0;
  }
  e = 0;
  for (int i = 1; i <= n; i++) {
    int now = (x2 / i) + (x2 % i != 0);
    set<int>::iterator it = v.lower_bound(now);
    int metka = m[*it];
    if (*it < now) {
      break;
    }
    int res1 = res(1, 0, N - 1, metka, N - 1);
    if (res1 >= i) {
      e = 1;
      for (int j = 0; j < n; j++) {
        if (c[j].first >= now) {
          int h = i;
          for (int z = j; z < n; z++) {
            if (c[z].second != -1 && h) {
              h--;
              ans2.push_back(c[z].second + 1);
            }
          }
          break;
        }
      }
      break;
    }
  }
  if (!e) {
    cout << "No";
    return 0;
  }
  if (e1) {
    swap(ans1, ans2);
  }
  sort(ans1.begin(), ans1.end());
  sort(ans2.begin(), ans2.end());
  cout << "Yes" << endl;
  cout << (int)ans1.size() << " " << (int)ans2.size() << endl;
  for (auto j : ans1) {
    cout << j << " ";
  }
  cout << endl;
  for (auto j : ans2) {
    cout << j << " ";
  }
}
