#include "bits/stdc++.h"
#ifndef LOCAL
#define dbg(...)
#define debug(...)
#endif
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
using namespace std;
#define int long long
#define sz(v) (int)(v).size()
#define all(v) begin(v),end(v)
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define cinv(v) for (auto &it:v) cin>>it;
#define coutv(v) for (auto &it:v) cout<< it<<' '; cout<<'\n';
#define unique(v) sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define rand(l, r) uniform_int_distribution<ll>(l, r)(rng)
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
template<class T> using V = vector<T>;
// template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const int N=2e5+5;
int t[4*N];
void upd(int node, int b, int e, int i, int x){
if (b==e) return void(t[node]=max(t[node], x));
int m=(b+e)>>1;
if (i<=m) upd(node<<1, b, m, i, x);
else upd(node<<1|1, m+1, e, i, x);
t[node]=max(t[node<<1], t[node<<1|1]);
}
int query(int node, int b, int e, int l, int r){
if (b>r || e<l) return 0;
if (b>=l && e<=r) return t[node];
int m=(b+e)>>1;
return max(query(node<<1, b, m, l, r), query(node<<1|1, m+1, e, l, r));
}
void shelby(int tc) {
int n;
cin>>n;
for (int i=1;i<=4*n+5;++i) t[i]=0;
vector<int> a(n+1), b(n+1);
for (int i=1;i<=n;++i) cin>>a[i];
for (int i=1;i<=n;++i) cin>>b[i];
int mx=0;
vector<int> v(n+1);
for (int i=n;i;--i){
int now=query(1,1,n,a[i]+1,n);
debug(i,now);
upd(1,1,n,a[i],b[i]+now);
int x= query(1,1,n,a[i],a[i]);
v[i]=x;
mx=max(mx,x);
}
int ans=0;
for (int i=n;i;--i){
ans++;
if (v[i]==mx) break;
}
debug(v);
cout<<ans<<'\n';
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int t = 1;
cin >> t;
for (int _ = 1; _ <= t; ++_) shelby(_);
}