#include #include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) void solve(){ } int op(int a, int b){ return max(a, b); } int e(){return -1;} int main(){ int n, w; cin >> n >> w; vi vv(n), vw(n); rep(i, n)cin >> vv[i]; rep(i, n)cin >> vw[i]; //segtree seg(n); //vector> vs(w+1, seg); vvi dp(n, vi(w+1, -1)); dp[n-1][0] = 0; dp[n-1][vw[n-1]] = vv[n-1]; //vs[0].set(n-1, 0); //vs[vw[n-1]].set(n-1, vv[n-1]); drep(i, n-1){ rep(j, w+1){ /*int t = vs[j].get(i+1); vs[j].set(i, t); if(j - vw[i] < 0)continue; int p = vs[j-vw[i]].get(i+1); if(p == -1)continue; if(t < p + vv[i])vs[j].set(i, p + vv[i]);*/ dp[i][j] = dp[i+1][j]; if(j - vw[i] < 0)continue; if(dp[i+1][j - vw[i]] == -1)continue; dp[i][j] = max(dp[i][j], dp[i+1][j - vw[i]] + vv[i]); } } int tmp = 0; rep(i, w+1)tmp = max(tmp, dp[0][i]); int v = 0; int itr = 0; int now = 0; vi ans; while(v < tmp){ bool ff = false; rep(j, w-now+1){ if(dp[n-1][j] >= tmp-v){ ans.push_back(n-1); ff = true; break; } } if(ff)break; int l = itr, r = n-1; int mid; while(r - l > 1){ mid = (r+l)/2; bool f = false; rep(j, w-now+1){ if(dp[mid][j] >= tmp-v){ f = true; break; } } if(f){ l = mid; }else{ r = mid; } } ans.push_back(l); v += vv[l]; now += vw[l]; itr = l+1; if(itr >= n)break; }sort(all(ans)); cout << ans.size() << endl; for(auto i : ans) cout << i+1 << " "; cout << endl; return 0; }