#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using dt = array<int, 2>;
template<typename T> struct SegmentTree {
vector<T> st;
vector<T>& a;
T defaultValue = 0;
SegmentTree(vector<T>& arr) : a(arr) {
st.resize(4 * arr.size());
build(1, 0, arr.size() - 1);
}
T combine(T x, T y) {
return max(x, y);
}
void build(int u, int s, int e) {
if (s == e) {
st[u] = a[s];
return;
}
int v = 2 * u, w = (2 * u) + 1, m = (s + e) / 2;
build(v, s, m);
build(w, m + 1, e);
st[u] = combine(st[v], st[w]);
}
T _query(int l, int r, int u, int s, int e) {
if (e < l || r < s) return defaultValue;
if (l <= s && e <= r) return st[u];
int v = 2 * u, w = (2 * u) + 1, m = (s + e) / 2;
T lc = _query(l, r, v, s, m);
T rc = _query(l, r, w, m + 1, e);
return combine( lc, rc);
}
void _update(int idx, T newV, int u, int s, int e) {
if (s == e) {
st[u] = a[s] = newV;
return;
}
int v = 2 * u, w = (2 * u) + 1, m = (s + e) / 2;
if (idx <= m) _update(idx, newV, v, s, m);
else _update(idx, newV, w, m + 1, e);
st[u] = combine(st[v], st[w]);
}
T query(int l, int r) {
return _query(l, r, 1, 0, (int)a.size() - 1);
}
void update(int idx, T newV) {
_update(idx, newV, 1, 0, (int)a.size() - 1);
}
// query(l, r);
// update(idx, newV);
};
void test() {
int n;
cin >> n;
vector<ll> a(n), b(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
a[i]--;
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
ll mx = 0;
vector<ll> v(n);
SegmentTree<ll> seg(v);
vector<ll> dp(n);
for (int i = n - 1; i >= 0; i--) {
dp[i] = b[i];
if (a[i] + 1 < n) dp[i] += seg.query(a[i] + 1, n - 1);
seg.update(a[i], dp[i]);
mx = max(mx, dp[i]);
}
for (int i = n - 1; i >= 0; i--) {
if (dp[i] == mx) {
cout << n - i << "\n";
return;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1;
cin >> T;
for (int i = 1; i <= T; i++) {
test();
}
return 0;
}