#include using namespace std; typedef long long ll; struct S { int n; vector mx, lz; void init(int n_) { n = max(n_, 1); mx.assign(4 * n, 0); lz.assign(4 * n, 0); } void ap(int nd, ll v) { mx[nd] += v; lz[nd] += v; } void pu(int nd) { if (lz[nd]) { ap(2 * nd, lz[nd]); ap(2 * nd + 1, lz[nd]); lz[nd] = 0; } } void up(int nd, int l, int r, int ql, int qr, ll v) { if (qr < l || r < ql) return; if (ql <= l && r <= qr) { ap(nd, v); return; } pu(nd); int m = (l + r) >> 1; up(2 * nd, l, m, ql, qr, v); up(2 * nd + 1, m + 1, r, ql, qr, v); mx[nd] = max(mx[2 * nd], mx[2 * nd + 1]); } ll qr2(int nd, int l, int r, int ql, int qr) { if (qr < l || r < ql) return 0; if (ql <= l && r <= qr) return mx[nd]; pu(nd); int m = (l + r) >> 1; return max(qr2(2 * nd, l, m, ql, qr), qr2(2 * nd + 1, m + 1, r, ql, qr)); } void add(int l, int r, ll v) { if (l > r) return; up(1, 0, n - 1, l, r, v); } ll qm(int l, int r) { if (l > r) return 0; return qr2(1, 0, n - 1, l, r); } }; struct J { ll p; int s; ll q; bool operator>(const J &o) const { if (p != o.p) return p > o.p; return s > o.s; } }; int main() { int T; scanf("%d", &T); while (T--) { int n; ll K; scanf("%d %lld", &n, &K); vector A(n + 2), B(n + 2), C(n + 2), D(n + 2); for (int i = 1; i <= n; i++) scanf("%lld", &A[i]); for (int i = 1; i <= n; i++) scanf("%lld", &B[i]); for (int i = 1; i <= n; i++) scanf("%lld", &C[i]); for (int i = 1; i <= n; i++) scanf("%lld", &D[i]); S sg; sg.init(n + 2); priority_queue, greater> H; ll g = 0; for (int i = 1; i <= n; i++) { if (B[i] > 0) H.push({A[i], i, B[i]}); ll d = D[i]; while (d > 0) { while (!H.empty()) { J e = H.top(); if (e.q == 0) { H.pop(); continue; } if (e.s < i) { ll m = sg.qm(e.s, i - 1); if (m >= K) { H.pop(); continue; } } break; } if (H.empty()) break; J e = H.top(); if (e.p >= C[i]) break; ll sl; if (e.s >= i) sl = (ll)4e18; else sl = K - sg.qm(e.s, i - 1); ll tk = min({e.q, d, sl}); if (tk <= 0) { H.pop(); continue; } g += (C[i] - e.p) * tk; if (e.s < i) sg.add(e.s, i - 1, tk); d -= tk; H.pop(); if (e.q - tk > 0) H.push({e.p, e.s, e.q - tk}); H.push({C[i], i, tk}); } } printf("%lld\n", g); } return 0; }