#include #include using namespace std; using namespace atcoder; using ll=long long; using ull=unsigned long long; using ld=long double; using i128=__int128; using P=pair; template using vc=vector; template using vv=vc>; using vl=vc; using vvl=vc>; using vul=vc; using vs=vc; using vb=vc; #define rep(i,s,n) for(ll i=s;i<(n);i++) #define Rep(i,s,n) for(ll i=n;i>=s;i--) #define nall(x) x.begin(),x.end() #define rall(a) a.rbegin(),a.rend() #define pb push_back #define eb emplace_back #define pob pop_back #define nexp(v) next_permutation(v) #define prep(v) prev_permutation(v) #define YES cout<<"Yes"<b)a=b;} void chmax(ll &a,ll b){if(a bit; explicit DynamicBitsetSubsetSum(int max_sum):S(max_sum),hi(0),W((max_sum+64)>>6),bit(W,0){ bit[0]=1; } private: void trim(){ int rem=(S+1)&63; if(rem)bit.back()&=(1ULL<=0); if(x==0||x>S)return; int new_hi=(x>S-hi?S:hi+x); int word_shift=x>>6; int bit_shift=x&63; int top=new_hi>>6; if(bit_shift==0){ for(int i=top;i>=word_shift;i--)bit[i]|=bit[i-word_shift]; }else{ for(int i=top;i>=word_shift;i--){ int src=i-word_shift; ull v=bit[src]<=0)v|=bit[src-1]>>(64-bit_shift); bit[i]|=v; } } hi=new_hi; trim(); } bool test(int x)const{ if(x<0||x>S)return false; return(bit[x>>6]>>(x&63))&1ULL; } int prev(int x)const{ if(x<0)return -1; x=min(x,S); int w=x>>6; int r=x&63; ull v=bit[w]; if(r!=63)v&=(1ULL<<(r+1))-1; if(v)return(w<<6)+63-__builtin_clzll(v); for(--w;w>=0;w--){ if(bit[w])return(w<<6)+63-__builtin_clzll(bit[w]); } return -1; } int next(int x)const{ if(x>S)return -1; x=max(x,0); int w=x>>6; int r=x&63; ull v=bit[w]&(~0ULL<r)return false; int x=next(l); return x!=-1&&x<=r; } int max_reachable()const{ return prev(S); } }; using DBSS=DynamicBitsetSubsetSum; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ll t; cin >> t; while(t--){ ll n,s; cin >> n >> s; DBSS dp(s); rep(i,0,n){ ll a; cin >> a; dp.add(a); } cout << dp.max_reachable() << endl; } }