#include using namespace std; using int64 = long long; using i128 = __int128_t; static void print_i128(i128 x) { if (x == 0) { cout << 0 << '\n'; return; } string s; while (x > 0) { int d = (int)(x % 10); s.push_back(char('0' + d)); x /= 10; } reverse(s.begin(), s.end()); cout << s << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int N; int64 K; cin >> N >> K; vector A(N), B(N), C(N), D(N); for (int i = 0; i < N; i++) cin >> A[i]; for (int i = 0; i < N; i++) cin >> B[i]; for (int i = 0; i < N; i++) cin >> C[i]; for (int i = 0; i < N; i++) cin >> D[i]; // key = buy cost, value = number of unsold candidate jewels map mp; int64 sz = 0; i128 ans = 0; for (int i = 0; i < N; i++) { // 1) add today's buy candidates mp[A[i]] += B[i]; sz += B[i]; // 2) sell up to D[i], always from cheapest profitable ones int64 canSell = D[i]; while (canSell > 0 && !mp.empty()) { auto it = mp.begin(); int64 cost = it->first; int64 cnt = it->second; if (cost >= C[i]) break; int64 take = min(canSell, cnt); ans += (i128)take * (C[i] - cost); canSell -= take; sz -= take; it->second -= take; if (it->second == 0) mp.erase(it); } // 3) keep at most K cheapest unsold ones for future while (sz > K) { auto it = prev(mp.end()); // largest cost int64 cnt = it->second; int64 remove = min(cnt, sz - K); it->second -= remove; sz -= remove; if (it->second == 0) mp.erase(it); } } print_i128(ans); } return 0; }