#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define repr(i, n) for (int i = (int)(n) - 1; i >= 0; i--) #define repk(i, k, n) for (int i = k; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define mod1 1000000007 #define mod2 998244353 #define mod3 100000007 #define vi vector #define vs vector #define vc vector #define vl vector #define vb vector #define vvi vector> #define vvc vector> #define vvl vector> #define vvb vector> #define vvvi vector>> #define vvvl vector>> #define pii pair #define pil pair #define pli pair #define pll pair #define vpii vector> #define vpll vector> #define vvpii vector>> #define vvpll vector>> template void debug(T e) { cerr << e << endl; } template void debug(vector &v) { rep(i, v.size()) { cerr << v[i] << " "; } cerr << endl; } template void debug(vector> &v) { rep(i, v.size()) { rep(j, v[i].size()) { cerr << v[i][j] << " "; } cerr << endl; } } template void debug(vector> &v) { rep(i, v.size()) { cerr << v[i].first << " " << v[i].second << endl; } } template void debug(set &st) { for (auto itr = st.begin(); itr != st.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(multiset &ms) { for (auto itr = ms.begin(); itr != ms.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { cerr << itr->first << " " << itr->second << endl; } } void debug_out() { cerr << endl; } template void debug_out(Head H, Tail... T) { cerr << H << " "; debug_out(T...); } using mint = modint1000000007; void debug_mint1(vector &vec) { for (int i = 0; i < vec.size(); i++) { cerr << vec[i].val() << " "; } cerr << endl; } void debug_mint2(vector> &vec) { for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) { cerr << vec[i][j].val() << " "; } cerr << endl; } } int main() { ll T; cin >> T; while (T--){ ll N, M; cin >> N >> M; vector A(N); vector B(M); vector C(N); vector D(M); rep(i, N) cin >> A[i]; rep(i, M) cin >> B[i]; rep(i, N) cin >> C[i]; rep(i, M) cin >> D[i]; vector RA(N); vector RB(M); rep(i, N) RA[i] = A[N - 1 - i]; rep(i, M) RB[i] = B[M - 1 - i]; vector sum_a(N + 1, 0); vector sum_b(M + 1, 0); vector sum_ra(N + 1, 0); vector sum_rb(M + 1, 0); rep(i, N) sum_a[i + 1] = sum_a[i] + A[i]; rep(i, M) sum_b[i + 1] = sum_b[i] + B[i]; rep(i, N) sum_ra[i + 1] = sum_ra[i] + RA[i]; rep(i, M) sum_rb[i + 1] = sum_rb[i] + RB[i]; // どちらか片方は必ず端まで伸びる? // 各色のインデックスを前もって計算しておく vector> id_a(N + M + 1, vector(0)); vector> id_b(N + M + 1, vector(0)); vector> id_ra(N + M + 1, vector(0)); vector> id_rb(N + M + 1, vector(0)); rep(i, N){ id_a[C[i]].push_back(i); id_ra[C[N - 1 - i]].push_back(i); } rep(i, M){ id_b[D[i]].push_back(i); id_rb[D[M - 1 - i]].push_back(i); } ll ans = -1; // 片方の端を固定し、もう片方の中央を固定する for (ll i = 0; i < M; i++){ ll ub = min(min(i, M - 1 - i), (N + 1) / 2 - 1); auto it = lower_bound(all(id_a[D[i]]), ub + 1); if (it == id_a[D[i]].begin()) continue; it--; ll id = *it; // debug_out(i, id); ans = max(ans, sum_a[id * 2 + 1] + sum_b[i + id + 1] - sum_b[i - id]); } for (ll i = 0; i < M; i++){ ll ub = min(min(i, M - 1 - i), (N + 1) / 2 - 1); auto it = lower_bound(all(id_ra[D[i]]), ub + 1); if (it == id_ra[D[i]].begin()) continue; it--; ll id = *it; // debug_out(i, id); ans = max(ans, sum_ra[id * 2 + 1] + sum_b[i + id + 1] - sum_b[i - id]); } for (ll i = 0; i < N; i++){ ll ub = min(min(i, N - 1 - i), (M + 1) / 2 - 1); auto it = lower_bound(all(id_b[C[i]]), ub + 1); if (it == id_b[C[i]].begin()) continue; it--; ll id = *it; // debug_out(i, id); ans = max(ans, sum_b[id * 2 + 1] + sum_a[i + id + 1] - sum_a[i - id]); } for (ll i = 0; i < N; i++){ ll ub = min(min(i, N - 1 - i), (M + 1) / 2 - 1); auto it = lower_bound(all(id_rb[C[i]]), ub + 1); if (it == id_rb[C[i]].begin()) continue; it--; ll id = *it; // debug_out(i, id); ans = max(ans, sum_rb[id * 2 + 1] + sum_a[i + id + 1] - sum_a[i - id]); } cout << ans << endl; } }