#include <bits/stdc++.h>
using namespace std;
template <class T>
istream &operator>>(istream &is, vector<T> &v) {
  for (auto &item : v) is >> item;
  return is;
}
template <class T1, class T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  is >> p.first >> p.second;
  return is;
}
template <template <typename, typename...> class V, typename... Args>
typename std::enable_if<!std::is_same<std::string, V<Args...>>::value,
                        ostream &>::type
operator<<(ostream &os, const V<Args...> &cont) {
  for (const auto &item : cont) os << item << " ";
  os << endl;
  return os;
}
template <class T1, class T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << p.first << ';' << p.second;
  return os;
}
template <class T>
struct VectorHasher {
  T operator()(const vector<T> &V) const {
    T hash = 0;
    for (size_t i = 0; i < V.size(); i++) hash ^= V[i];
    return hash;
  }
};
static int _ = [] {
  ios_base::sync_with_stdio(false);
  return 0;
}();
int main() {
  int64_t n;
  while (cin >> n) {
    vector<int64_t> x(2);
    cin >> x;
    set<pair<int64_t, int64_t>> c;
    for (int64_t i = 0; i < n; i++) {
      int64_t item;
      cin >> item;
      c.insert({item, i + 1});
    }
    vector<vector<int64_t>> ans(2);
    for (int64_t i = 0; i < 2; i++) {
      while (x[i] > 0 and !c.empty()) {
        int64_t l = 0, r = c.size() - 1;
        while (l < r) {
          int64_t m = l + (r - l) / 2;
          if (next(c.begin(), m)->first < x[i])
            l = m + 1;
          else
            r = m;
        }
        auto it = next(c.begin(), r);
        x[i] -= it->first;
        ans[i].push_back(it->second);
        c.erase(it);
      }
    }
    if (x[0] <= 0 and x[1] <= 0) {
      cout << "YES" << endl;
      cout << ans[0].size() << " " << ans[1].size() << endl;
      cout << ans;
    } else {
      cout << "NO" << endl;
    }
    break;
    cout << "------------------------\n";
  }
  return 0;
}
