#include using namespace std; struct SegTree { struct Node { long long cnt=0, sum=0; }; int n; vector val; vector st; SegTree(const vector& v): val(v) { int sz = val.size(); n = 1; while (n < sz) n <<= 1; st.assign(2*n, {}); } void add(int idx, long long c) { int i = idx + n; st[i].cnt += c; st[i].sum += c * val[idx]; for (i >>= 1; i; i >>= 1) { st[i].cnt = st[i<<1].cnt + st[i<<1|1].cnt; st[i].sum = st[i<<1].sum + st[i<<1|1].sum; } } long long total_cnt() const { return st[1].cnt; } pair remove_k_smallest(int l, int r, long long k, int i, int nl, int nr) { if (k==0 || r>1; auto left = remove_k_smallest(l,r,k,i<<1,nl,mid); auto right = remove_k_smallest(l,r,k-left.first,i<<1|1,mid+1,nr); st[i].cnt = st[i<<1].cnt + st[i<<1|1].cnt; st[i].sum = st[i<<1].sum + st[i<<1|1].sum; return {left.first+right.first, left.second+right.second}; } pair remove_k_largest(int l, int r, long long k, int i, int nl, int nr) { if (k==0 || r>1; auto right = remove_k_largest(l,r,k,i<<1|1,mid+1,nr); auto left = remove_k_largest(l,r,k-right.first,i<<1,nl,mid); st[i].cnt = st[i<<1].cnt + st[i<<1|1].cnt; st[i].sum = st[i<<1].sum + st[i<<1|1].sum; return {left.first+right.first, left.second+right.second}; } long long count_range(int l, int r, int i, int nl, int nr) { if (r>1; return count_range(l,r,i<<1,nl,mid) + count_range(l,r,i<<1|1,mid+1,nr); } long long count_range(int l, int r) { if (l>r) return 0; return count_range(l,r,1,0,n-1); } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int N; long long K; cin >> N >> K; vector A(N+1), B(N+1), C(N+1), D(N+1); for (int i=1;i<=N;i++) cin >> A[i]; for (int i=1;i<=N;i++) cin >> B[i]; for (int i=1;i<=N;i++) cin >> C[i]; for (int i=1;i<=N;i++) cin >> D[i]; vector vals; vals.reserve(N); for (int i=1;i<=N;i++) vals.push_back(C[i]); sort(vals.begin(), vals.end()); vals.erase(unique(vals.begin(), vals.end()), vals.end()); SegTree st(vals); long long profit = 0; for (int i=N;i>=1;i--) { int idxC = lower_bound(vals.begin(), vals.end(), C[i]) - vals.begin(); st.add(idxC, D[i]); long long total = st.total_cnt(); if (total > K) { long long excess = total - K; st.remove_k_smallest(0, (int)vals.size()-1, excess, 1, 0, st.n-1); } int pos = upper_bound(vals.begin(), vals.end(), A[i]) - vals.begin(); if (pos < (int)vals.size()) { long long avail = st.count_range(pos, (int)vals.size()-1); long long take = min(B[i], avail); if (take > 0) { auto got = st.remove_k_largest(pos, (int)vals.size()-1, take, 1, 0, st.n-1); profit += got.second - take * A[i]; } } } cout << profit << "\n"; } return 0; }