#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; vector ans; #define LL long long map < LL, list> memo; int N, half; LL S; LL P[40]; void left(int n,LL val,int bit){ if (n == half){ memo[val].push_back(bit); } else{ left(n + 1, val, bit); left(n + 1, val + P[n], bit + (1 << (N - 1 - n))); } } void right(int n, LL val, int bit){ if (n == N){ if (memo.count(S - val) > 0){ for (auto &b : memo[S - val]) ans.push_back(b + bit); } } else{ right(n + 1, val, bit); right(n + 1, val + P[n], bit + (1 << (N - 1 - n))); } } int main(void){ ans.reserve(50); cin >> N >> S; for (int i = 0; i < N; i++) { cin >> P[i]; } half = N / 2; left(0, 0, 0); right(half, 0, 0); sort(ans.begin(), ans.end(), greater()); for (auto &bit : ans){ list tmp; for (int i = N - 1; i >= 0; i--) if (bit&(1 << i))tmp.push_back(N - i); for (auto it = tmp.begin(); it != tmp.end(); ++it){ if (it != tmp.begin())cout << " "; cout << *it; } cout << endl; } return 0; }