# pragma GCC target("avx2") # pragma GCC optimize("O3") # pragma GCC optimize("unroll-loops") #include namespace { #pragma GCC diagnostic ignored "-Wunused-function" #include #pragma GCC diagnostic warning "-Wunused-function" using namespace std; using namespace atcoder; #define rep(i,n) for(int i = 0; i < (int)(n); i++) #define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--) #define all(x) begin(x), end(x) #define rall(x) rbegin(x), rend(x) template bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; } else return false; } template bool chmin(T& a, const T& b) { if (b < a) { a = b; return true; } else return false; } using ll = long long; using P = pair; using VI = vector; using VVI = vector; using VL = vector; using VVL = vector; } int main() { ios::sync_with_stdio(false); cin.tie(0); int tt; cin >> tt; while (tt--) { int n, m; cin >> n >> m; VI a(n), b(m), c(n), d(m); for (int& x : a) cin >> x; for (int& x : b) cin >> x; for (int& x : c) cin >> x, x--; for (int& x : d) cin >> x, x--; { VI used(n + m); for (int x : c) used[x] |= 1; for (int x : d) used[x] |= 2; for (int nxt = 0; int& s : used) { s = s == 3 ? nxt++ : -1; } for (int& x : c) x = used[x]; for (int& x : d) x = used[x]; } ll ans = -1; rep(_, 2) { swap(n, m); swap(a, b); swap(c, d); rep(_, 2) { rep(_, 2) { static VL sa, sb; sa.resize(n + 1), sb.resize(m + 1); rep(i, n) sa[i+1] = sa[i] + a[i]; rep(j, m) sb[j+1] = sb[j] + b[j]; using BS = bitset<100005>; static BS b2pos[100005]; rep(j, (m + 1) / 2) if (d[j] != -1) b2pos[d[j]].set(j); static BS undone; undone.set(); rrep(i, (n + 1) / 2) if (c[i] != -1) { BS todo = b2pos[c[i]] >> i & undone; for (int d = todo._Find_first(); d < ssize(todo); d = todo._Find_next(d)) { int j = i + d; chmax(ans, sa[i + 1 + i] + sb[j + 1 + i] - sb[j - i]); undone.reset(d); } } rep(j, (m + 1) / 2) if (d[j] != -1) b2pos[d[j]].reset(j); reverse(all(b)); reverse(all(d)); } reverse(all(a)); reverse(all(c)); } } cout << ans << '\n'; } }