#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define endl '\n' #define all(v) (v).begin(), (v).end() #define rall(v) (v).rbegin(), (v).rend() #define uniq(v) (v).erase(unique((v).begin(), (v).end()), (v).end()) typedef long long ll; typedef pair P; typedef unsigned int uint; typedef unsigned long long ull; struct pairhash { public: template size_t operator()(const pair &x) const { size_t seed = hash()(x.first); return hash()(x.second) + 0x9e3779b9 + (seed<<6) + (seed>>2); } }; const int inf = 1000000009; int main() { int n; ll s; scanf("%d%lld", &n, &s); ll ps[32]; for (int i = 0; i < n; i++) { scanf("%lld", &ps[i]); } int a = min(16, n); vector

hb(1<>j)&1) { sum += ps[j]; } } hb[i] = P(sum, i); } vector > res; if (n <= 16) { for (int i = 0; i < (1< t; for (int j = 0; j < a; j++) if ((i>>j)&1) t.push_back(j+1); res.push_back(t); } } } else { sort(all(hb)); int b = n - a; for (int i = 0; i < (1<>j)&1) { sum += ps[j+16]; } } int idx = lower_bound(all(hb), P(s-sum, -1)) - hb.begin(); int l = 0; while (hb[idx+l].first + sum == s) { vector t; int k = hb[idx+l].second; for (int j = 0; j < a; j++) if ((k>>j)&1) t.push_back(j+1); for (int j = 0; j < b; j++) if ((i>>j)&1) t.push_back(j+17); res.push_back(t); l++; } } } sort(all(res)); for (int i = 0; i < res.size(); i++) { for (int j = 0; j < res[i].size()-1; j++) printf("%d ", res[i][j]); printf("%d\n", res[i][res[i].size()-1]); } }