#include <bits/stdc++.h>
using ll = long long;
using namespace std;
struct PrD {
  ll MAX_VAL = 1e9 + 5;
  int n, a, b;
  vector<int> dp;
  vector<pair<int, int>> v;
  void main() {
    cin >> n >> a >> b;
    v.resize(n);
    dp.resize(n);
    for (int i = 0; i < n; ++i) {
      cin >> v[i].first;
      v[i].second = i + 1;
    }
    sort(v.begin(), v.end());
    dp[0] = v.back().first;
    for (int i = 1; i < n; ++i) {
      dp[i] = min(MAX_VAL, max(static_cast<ll>(v[n - i - 1].first) * (i + 1),
                               static_cast<ll>(dp[i - 1])));
    }
    reverse(dp.begin(), dp.end());
    for (int i = 1; i < n; ++i) {
      auto ans = solve(i);
      if (ans.first.size()) {
        cout << "Yes\n";
        cout << ans.first.size() << " " << ans.second.size() << "\n";
        for (int i = 0; i < ans.first.size(); ++i) cout << ans.first[i] << ' ';
        cout << '\n';
        for (int i = 0; i < ans.second.size(); ++i)
          cout << ans.second[i] << ' ';
        return;
      }
    }
    cout << "No";
  }
  pair<vector<int>, vector<int>> solve(int k) {
    int val1 = a / k + (a % k != 0);
    int val2 = b / k + (b % k != 0);
    auto comp = [](pair<int, int> p, int k) { return p.first < k; };
    auto it_a = lower_bound(v.begin(), v.end(), val1, comp);
    auto it_b = lower_bound(v.begin(), v.end(), val2, comp);
    if (it_a != v.end()) {
      int pos = it_a - v.begin();
      if (pos + k >= n) goto next_point;
      if (dp[pos + k] < b) goto next_point;
      return prepare(pos, k, a, b);
    }
  next_point:
    if (it_b != v.end()) {
      int pos = it_b - v.begin();
      if (pos + k >= n) return {{}, {}};
      if (dp[pos + k] < a) return {{}, {}};
      auto ans = prepare(pos, k, b, a);
      swap(ans.first, ans.second);
      return ans;
    }
    return {{}, {}};
  }
  pair<vector<int>, vector<int>> prepare(int start, int k, int first,
                                         int last) {
    vector<int> fpos, spos;
    for (int i = 0; i < k; ++i) fpos.push_back(v[start + i].second);
    int next_st = start + k;
    while (static_cast<ll>(v[next_st].first) * (n - next_st) < last) next_st++;
    k = n - next_st;
    for (int i = 0; i < k; ++i) spos.push_back(v[next_st + i].second);
    return {fpos, spos};
  }
};
int main() {
  PrD pr;
  pr.main();
}
