#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 500;
int n;
double x1, x2, temp;
struct Node {
  int id;
  double v;
} node[maxn];
bool cmp(Node a, Node b) { return a.v < b.v; }
bool Judge1(int cnt1, double x2) {
  for (int cnt2 = 1; cnt2 <= n - cnt1; cnt2++) {
    double p2 = x2 / cnt2;
    int q = lower_bound(node + 1, node + n + 1, Node{0, p2}, cmp) - node;
    if (q + cnt1 + cnt2 - 1 <= n) {
      cout << "Yes" << endl;
      cout << cnt1 << " " << cnt2 << endl;
      for (int i = n - cnt1 + 1; i <= n; i++) cout << node[i].id << ' ';
      cout << endl;
      for (int i = q; i <= q + cnt2 - 1; i++) cout << node[i].id << ' ' << endl;
      cout << endl;
      return true;
    }
  }
  return false;
}
bool Judge2(int cnt2, double x1) {
  for (int cnt1 = 1; cnt1 <= n - cnt2; cnt1++) {
    double p1 = x1 / cnt1;
    int p = lower_bound(node + 1, node + n + 1, Node{0, p1}, cmp) - node;
    if (p + cnt1 + cnt2 - 1 <= n) {
      cout << "Yes" << endl;
      cout << cnt1 << " " << cnt2 << endl;
      for (int i = p; i <= p + cnt1 - 1; i++) cout << node[i].id << " ";
      cout << endl;
      for (int i = n - cnt2 + 1; i <= n; i++) cout << node[i].id << " ";
      cout << endl;
      return true;
    }
  }
  return false;
}
int main() {
  cin >> n >> x1 >> x2;
  for (int i = 1; i <= n; i++) {
    node[i].id = i;
    cin >> node[i].v;
  }
  sort(node + 1, node + 1 + n, cmp);
  int cnt1 = 1, seat, cnt2 = 1;
  for (; cnt1 <= n - 1; cnt1++) {
    temp = x1 / cnt1;
    seat = lower_bound(node + 1, node + n + 1, Node{0, temp}, cmp) - node;
    if (seat + cnt1 - 1 <= n) break;
  }
  for (; cnt2 <= n - 1; cnt2++) {
    temp = x2 / cnt2;
    seat = lower_bound(node + 1, node + n + 1, Node{0, temp}, cmp) - node;
    if (seat + cnt2 - 1 <= n) break;
  }
  if (!Judge1(cnt1, x2) && !Judge2(cnt2, x1)) cout << "No" << endl;
}
