#include class TestCase { private: int n; std::vector C, W; std::vector checked; void Algorithm() { checked.resize(n, false); int next_r = 0; long long sum = 0; long long answer = 0; for (int l = 0; l < n; l++) { while (next_r < n and !checked[C[next_r]]) { checked[C[next_r]] = true; sum += W[next_r]; next_r++; } answer = std::max(answer, sum); assert(l < next_r); sum -= W[l]; checked[C[l]] = false; } printf("%lld\n", answer); } public: int Run() { scanf("%d", &n); assert(1 <= n and n <= 1000 * 1000); C.resize(n); W.resize(n); for (int i = 0; i < n; i++) { scanf("%d", &C[i]); assert(0 <= C[i] and C[i] < n); } for (int i = 0; i < n; i++) { scanf("%d", &W[i]); assert(0 <= W[i] and W[i] <= 1000 * 1000 * 1000); } Algorithm(); return n; } }; int main() { int t; scanf("%d", &t); assert(1 <= t and t <= 100); int sum = 0; while (t--) sum += TestCase().Run(); assert(1 <= sum and sum <= 1000 * 1000); return EXIT_SUCCESS; }