#include<bits/stdc++.h>
using namespace std;
#define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
#define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
typedef long long ll;
inline int read(){
	int x;
	char c;
	int f=1;
	while((c=getchar())!='-' && (c>'9' || c<'0'));
	if(c=='-') c=getchar(),f=-1;
	x=c^'0';
	while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
	return x*f;
}
inline ll readll(){
	ll x;
	char c;
	int f=1;
	while((c=getchar())!='-' && (c>'9' || c<'0'));
	if(c=='-') c=getchar(),f=-1;
	x=c^'0';
	while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
	return x*f;
}
const int maxn=3e5+10;
struct point{
	int w,id;
	bool operator <(const point &rhs) const{
		return w>rhs.w;
	}
}a[maxn];
int main(){
	int n=read(),x1=read(),x2=read();
	REP(i,1,n) a[i].w=read(),a[i].id=i;
	sort(a+1,a+n+1);
	REP(i,1,n){
		if(x1>=(ll)i*a[i].w && x2>=(ll)i*a[i].w) continue;
		int x=ceil(x1*1.0/a[i].w);
		if(x<=i && i>x && 1.0*x2/(i-x)<=a[i-x].w){
			printf("Yes\n");
			printf("%d %d\n",x,i-x);
			REP(j,0,x-1) printf("%d%c",a[i-j].id,j==jend?'\n':' ');
			REP(j,x,i-1) printf("%d%c",a[i-j].id,j==jend?'\n':' ');
			return 0;
		}
		x=ceil(x2*1.0/a[i].w);
		if(x<=i && i>x && 1.0*x1/(i-x)<=a[i-x].w){
			printf("Yes\n");
			printf("%d %d\n",i-x,x);
			REP(j,0,x-1) printf("%d%c",a[i-j].id,j==jend?'\n':' ');
			REP(j,x,i-1) printf("%d%c",a[i-j].id,j==jend?'\n':' ');
			return 0;
		}
	}
	printf("No\n");
	return 0;
}