#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const double PI = acos(-1.0);
template <class T>
T gcd(T a, T b) {
  if (!b) return a;
  return gcd(b, a % b);
}
const int maxn = 3e5 + 10;
int n, x1, x2, mxp, mnp, mx, mn;
pair<int, int> c[maxn];
vector<int> ans[2];
void get_ans(int l, int r) {
  for (int i = l; i < r; i++) ans[mnp].push_back(c[i].second);
  for (int i = r; i < n; i++) ans[mxp].push_back(c[i].second);
}
int solve() {
  int l, r;
  for (r = n - 1; r >= 0; r--)
    if (c[r].first * 1LL * (n - r) >= mx) break;
  if (r < 0) return 0;
  for (l = r - 1; l >= 0; l--) {
    if (c[l].first * 1LL * (r - l) >= mn) break;
  }
  if (l < 0) return 0;
  get_ans(l, r);
  return 1;
}
int main() {
  cin >> n >> x1 >> x2;
  if (x1 > x2)
    mxp = 0, mnp = 1, mx = x1, mn = x2;
  else
    mxp = 1, mnp = 0, mx = x2, mn = x1;
  for (int i = 0; i < n; i++) scanf("%d", &c[i].first), c[i].second = i + 1;
  sort(c, c + n);
  if (solve()) {
    printf("Yes\n%d %d\n", ans[0].size(), ans[1].size());
    for (int i = 0; i < ans[0].size(); i++)
      printf("%d%c", ans[0][i], (i == ans[0].size() - 1) ? '\n' : ' ');
    for (int i = 0; i < ans[1].size(); i++)
      printf("%d%c", ans[1][i], (i == ans[1].size() - 1) ? '\n' : ' ');
    return 0;
  }
  swap(mx, mn);
  swap(mnp, mxp);
  if (solve()) {
    printf("Yes\n%d %d\n", ans[0].size(), ans[1].size());
    for (int i = 0; i < ans[0].size(); i++)
      printf("%d%c", ans[0][i], (i == ans[0].size() - 1) ? '\n' : ' ');
    for (int i = 0; i < ans[1].size(); i++)
      printf("%d%c", ans[1][i], (i == ans[1].size() - 1) ? '\n' : ' ');
  } else
    printf("No\n");
  return 0;
}
