/*
15
63 25 66 36 39 29 93 3 188 128 191 82 179 178 168
*/
#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for(int i = (a); i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define endl '\n'

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;

const ll mod = 1000000007;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

using State = pair<pii, bool>;

vi a;
// what cases do i have to handle?
// if the mod = 0, need to not count degenerate one
vi solve(vector<vector<vector<State>>>& prev, pii initial, bool ig) {
	vi ans;

	int whichDefault = (ig ? -1 : -2);
	bool once = false;
	while(initial != mp(-1, -1)) {
		int row = initial.first;
		int col = initial.second;
		//cout << row << " " << col << endl << flush;
		int len = sz(prev[row][col]);
		if(len + whichDefault >= 0) {
			// cout << len << " " << whichDefault << endl << flush;
			//assert(len + whichDefault < len);
			State taken = prev[row][col][len + whichDefault];
			if(taken.second) {
				ans.pb(taken.first.first + 1);
			}

			initial = taken.first;

			if(!once) {
				whichDefault = -1;
				once = true;
			}

		} else {
			// take 0
			State taken = prev[row][col][0];
			// it means that to get to the current state, we took from the previous one
			if(taken.second) {
				ans.pb(taken.first.first + 1);
			}
			initial = taken.first;
		}
	}
	reverse(all(ans));
	return ans;
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(nullptr);

	// if there exists 2 different elements = x mod 200, then obv

	int n; cin >> n;
	a.resize(n); trav(x, a) cin >> x;

	map<int,vector<int>> cnt;
	for(int i = 0; i < n; i++) {
		cnt[a[i] % 200].pb(i);
	}

	trav(p, cnt) {
		if(sz(p.second) >= 2) {
			cout << "Yes" << endl;
			cout << 1 << " " << p.second[0] + 1 << endl;
			cout << 1 << " " << p.second[1] + 1 << endl;
			return 0;
		}
	}

	// includes the dummy subsequence
	vector<vector<ll>> dp(n + 1, vector<ll>(200, 0));
	vector<vector<vector<State>>> prev(n + 1, vector<vector<State>>(200));
	dp[0][0] = 1;
	prev[0][0].pb({mp(-1,-1), false});

	for(int i = 0; i < n; i++) {
		for(int j = 0; j < 200; j++) {
			ll here = dp[i][j];
			if(here != 0) {
				// include this element
				dp[i + 1][(j + a[i]) % 200] += here;
				if(prev[i + 1][(j + a[i]) % 200].size() <= 3) {
					prev[i + 1][(j + a[i]) % 200].pb({mp(i, j), true});
				}	
				dp[i + 1][j] += here;
				if(prev[i + 1][j].size() <= 3) {
					prev[i + 1][j].pb({mp(i,j), false});
				}	
			}
		}
	}

	vi b, c;
	for(int j = 0; j <= n; j++) {
		for(int i = 0; i < 200; i++) {
			if(i == 0) {
				if(dp[j][i] >= 3) {
					cout << "Yes" << endl;
					b = solve(prev, {n, i}, false);
					c = solve(prev, {n, i}, true);
					cout << sz(b) << " "; trav(x, b) cout << x << " ";
					cout << endl;
					cout << sz(c) << " "; trav(x, c) cout << x << " ";
					cout << endl;
					return 0;
				}
			} else {
				if(dp[j][i] >= 2) {
					cout << "Yes" << endl;
					b = solve(prev, {n, i}, false);
					c = solve(prev, {n, i}, true);
					cout << sz(b) << " "; trav(x, b) cout << x << " ";
					cout << endl;
					cout << sz(c) << " "; trav(x, c) cout << x << " ";
					cout << endl;
					return 0;
				}
			}
		} 
	}
	
	cout << "No" << endl;
    return 0;
}


#include <bits/stdc++.h>
using namespace std;

#define fastio ios_base::sync_with_stdio(0);cin.tie(0)
#define fp(i,a,b) for(int i=a ; i<b ; i++)
#define fn(i,a,b) for(int i=a ; i>=b ; i--)
#define fit(i,x) for(auto i=x.begin() ; i != x.end() ; i++)
#define pb push_back
#define ff first
#define ss second
#define all(x) x.begin(),x.end()

typedef long long ll;
typedef pair<int,int> ii;
typedef vector<ii> vii;
typedef vector<int> vi;
typedef vector<ll> vll;

const int M=3e3+5;
const int INF=1e9;
const int MOD=998244353;

ll dp[M][M<<1];

int main(){

	fastio;
	int n,k; cin >> n >> k;
	dp[0][0] = 1;
	
	fp(i,1,M)
		fn(j,i,1){
			dp[i][j] = dp[i-1][j-1];
			if (2*j <= i) dp[i][j] = (dp[i][j] + dp[i][j<<1]) % MOD;
		}
		
	cout << dp[n][k] << "\n";

	return 0;
}