#include #include #include #include #include #include using namespace std; #define in cin #define out cout int N, S; vector P; void resolve() { int N1 = N / 2; int N2 = N - N1; map> P2; vector P3; for (int i = 0; i < (1 << N2); i++) { int sum = 0; for (int k = 0; k < N2; k++) { if (i & (1 << k)) { sum += P[N - 1 - (k + N1)]; } } P2[sum].push_back(i << N1); } for (int i = 0; i < (1 << N1); i++) { int sum = 0; for (int k = 0; k < N1; k++) { if (i & (1 << k)) { sum += P[N - 1 - k]; } } auto ite = P2.find(S - sum); if (ite != P2.end()) { vector& p2 = ite->second; for (int i2 : p2) { P3.push_back(i | i2); } } } sort(P3.begin(), P3.end(), greater()); for (int i : P3) { bool is_first = true; for (int k = 0; k < N; k++) { if (i & (1 << (N - 1 - k))) { if (!is_first) { out << " "; } out << k + 1; is_first = false; } } out << endl; } } int main() { in >> N >> S; P.resize(N); for (int i = 0; i < N; i++) in >> P[i]; resolve(); }