#include <cstdint>
#include <vector>
#include <bitset>
#include <iostream>
#include <queue>
using namespace std;
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
#define forbitset(i, b) for (int i = b._Find_first(); i < b.size(); i = b._Find_next(i))
const int maxS = 1e4;
int main() {
int n, S;
cin >> n >> S;
vector<int> a(n), p(S+1);
bitset<maxS+1> f; // f[x]
f[0] = 1;
// O(n*S / wordSize) // w=wordSize
// wordSize >= logn
forn(j, n) { // a[0] + a[2] + a[4] = S
cin >> a[j];
// // a = 2
// // f = 010101010101011100000000000
// // f>>a = 00010101010101011100000000000
auto b = (f << a[j]) & ~f;
// 01010101|01011111|110000001|11111111|
// >>3
// 000|01010101|01011111|110000001|11111111|
forbitset(i, b)
p[i] = j;
f |= f << a[j];
}
forn(j, n) {
cin >> a[j];
for (int i = S - a[j]; i >= 0; i--)
if (f[i] && !f[i + a[j]]) { // если я умею получать i
f[i + a[j]] = 1; // то и i+a теперь тоже
p[i] = j;
}
}
}
|