#generated by ChatGPT import sys from bisect import bisect_right def solve_left(a, b, c, d): """ a 側の部分列が a[0] を含む場合の最大スコアを求める。 """ n = len(a) m = len(b) # 累積和 asum = [0] * (n + 1) bsum = [0] * (m + 1) for i in range(n): asum[i + 1] = asum[i] + a[i] for i in range(m): bsum[i + 1] = bsum[i] + b[i] # positions[color] := # a において、その色が現れる位置の昇順リスト positions = [[] for _ in range(n + m)] for i in range(n): positions[c[i]].append(i) result = -1 max_center = (n - 1) // 2 # b 側の中心 j を固定する for j in range(m): limit = min( j, m - 1 - j, max_center, ) pos = positions[d[j]] # limit 以下の最大位置を探す k = bisect_right(pos, limit) if k == 0: continue i = pos[k - 1] # a 側の区間は [0, 2i] sum_a = asum[2 * i + 1] # b 側の区間は [j-i, j+i] sum_b = bsum[j + i + 1] - bsum[j - i] result = max(result, sum_a + sum_b) return result def main(): input_data = list(map(int, sys.stdin.buffer.read().split())) it = iter(input_data) t = next(it) answers = [] for _ in range(t): n = next(it) m = next(it) a = [next(it) for _ in range(n)] b = [next(it) for _ in range(m)] c = [next(it) - 1 for _ in range(n)] d = [next(it) - 1 for _ in range(m)] answer = -1 # X が A_1 を含む場合 answer = max(answer, solve_left(a, b, c, d)) # X が A_N を含む場合 a.reverse() c.reverse() answer = max(answer, solve_left(a, b, c, d)) # 元に戻す a.reverse() c.reverse() # A と B を交換 a, b = b, a c, d = d, c # Y が B_1 を含む場合 answer = max(answer, solve_left(a, b, c, d)) # Y が B_M を含む場合 a.reverse() c.reverse() answer = max(answer, solve_left(a, b, c, d)) answers.append(str(answer)) sys.stdout.write("\n".join(answers)) if __name__ == "__main__": main()