#include <bits/stdc++.h>
using namespace std;
struct node {
  int c, wei;
} q[300010];
bool cmp(node a, node b) { return a.c < b.c; }
int c[300010], f[300010], g[300010];
int n, x1, x2, las = -1, ans = -1;
int main() {
  scanf("%d%d%d", &n, &x1, &x2);
  for (int i = 1; i <= n; i++) scanf("%d", &c[i]), q[i].c = c[i], q[i].wei = i;
  sort(q + 1, q + n + 1, cmp);
  sort(c + 1, c + n + 1);
  for (int i = n; i >= 1; i--) {
    if (c[i] >= x2 * 1.0 / (n - i + 1)) {
      las = i;
      break;
    }
  }
  if (las == -1) return 0 * printf("No\n");
  for (int i = 1; i <= n; i++) {
    f[i] = (n - i + 1) - x2 * 1.0 / c[i];
    g[i] = f[i] > f[i - 1] ? i : g[i - 1];
    f[i] = max(f[i], f[i - 1]);
  }
  for (int i = 1; i < n; i++) {
    int r = lower_bound(c + 1, c + n + 1, x1 * 1.0 / i) - c;
    if (r + i - 1 > n) continue;
    if (las >= r + i) {
      printf("Yes\n");
      printf("%d %d\n", i, n - las + 1);
      for (int j = r; j <= r + i - 1; j++) printf("%d ", q[j].wei);
      printf("\n");
      for (int j = las; j <= n; j++) printf("%d ", q[j].wei);
      printf("\n");
      return 0;
    }
    if (g[r - 1] >= i) {
      printf("Yes\n");
      printf("%d %d\n", i, ((r - 1) - g[r - 1] + 1) + (n - (r + i) + 1));
      for (int j = r; j <= r + i - 1; j++) printf("%d ", q[j].wei);
      printf("\n");
      for (int j = g[r - 1]; j <= r - 1; j++) printf("%d ", q[j].wei);
      for (int j = r + i; j <= n; j++) printf("%d ", q[j].wei);
      printf("\n");
      return 0;
    }
  }
  printf("No\n");
  return 0;
}
