#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAX 2100010
#define MAXN 1000010
#define INF 2000000000
typedef pair<int, int> ii;
typedef long long int ll;
int c[2*MAXN], w[2*MAXN], t[MAX], lazy[MAX], n, m;
ii aa[MAXN], bb[MAXN];
ll intercala(int p, int q, int r, int v[]){
ll inv = 0;
int i=p, j=q, k=0;
while(i<q && j<r){
if(v[i]>v[j]){
inv += q-i;
w[k++]=v[j++];
}
else{
w[k++]=v[i++];
}
}
while(i<q){ w[k++]=v[i++]; }
while(j<r){ w[k++]=v[j++]; }
for(int i=p; i<r; i++){ v[i]=w[i-p]; }
return inv;
}
ll merge(int p, int r, int v[]){
ll inv = 0;
if(p<(r-1)){
int q = (p+r)/2;
inv += merge(p, q, v);
inv += merge(q, r, v);
inv += intercala(p, q, r, v);
}
return inv;
}
int lazyValue(int node, int L, int R){
return lazy[node] + t[node];
}
void refresh(int node, int L, int R){
int nl = 2*node, nr = 2*node+1;
t[node] = lazyValue(node, L, R);
lazy[nl] += lazy[node];
lazy[nr] += lazy[node];
lazy[node] = 0;
}
void st_build(int node, int L, int R){
if(L==R){
t[node] = L+1;
return ;
}
int nl = 2*node, nr = 2*node+1;
st_build(nl, L, (L+R)/2);
st_build(nr, (L+R)/2+1, R);
t[node] = min(t[nl], t[nr]);
}
int st_query(int node, int L, int R, int i, int j){
if(R<i || j<L){
return INF;
}
if(i<=L && R<=j){
return lazyValue(node, L, R);
}
refresh(node, L, R);
int nl = 2*node, nr = 2*node+1;
int minl = st_query(nl, L, (L+R)/2, i, j);
int minr = st_query(nr, (L+R)/2+1, R, i, j);
return min(minl, minr);
}
void st_update(int node, int L, int R, int pos, int sum){
if(R<pos){
return;
}
if(pos<=L && R<=n){
lazy[node] += sum;
return ;
}
refresh(node, L, R);
int nl = 2*node, nr = 2*node+1;
st_update(nl, L, (L+R)/2, pos, sum);
st_update(nr, (L+R)/2+1, R, pos, sum);
int minl = lazyValue(nl, L, (L+R)/2);
int minr = lazyValue(nr, (L+R)/2+1, R);
t[node] = min(minl, minr);
}
void st_build(){ st_build(1, 0, n); }
void st_create(){
memset(lazy, 0, sizeof(lazy));
st_build();
}
void st_update(int pos, int sum){ st_update(1, 0, n, pos, sum); }
int st_query(int i, int j){ return st_query(1, 0, n, i, j); }
int main() {
int tt;
scanf("%d", &tt);
for(int cas=1; cas<=tt; cas++){
scanf("%d %d", &n, &m);
for(int i=0; i<n; i++){
scanf("%d", &aa[i+1].first);
aa[i+1].second = i+1;
}
for(int i=0; i<m; i++){
scanf("%d", &bb[i].first);
bb[i].second = 0;
}
sort(bb, bb+m);
int qcur = 1, cur = bb[0].first, q = 0;
for(int i=1; i<m; i++){
if(bb[i].first != cur){
bb[q++] = ii(cur, qcur);
qcur = 1;
cur = bb[i].first;
}
else{
qcur++;
}
}
bb[q++] = ii(cur, qcur);
sort(bb, bb+q);
int k=0;
for(int i=0; i<q; i++){
for(int j=0; j<bb[i].second; j++){
c[k++] = bb[i].first;
}
}
for(int i=0; i<n; i++){
c[i+m] = aa[i+1].first;
}
sort(aa+1, aa+n+1);
st_create();
st_update(0, -1);
int i=1;
ll sum = 0;
for(int j=0; j<q; j++){
while(i<=n && aa[i].first<bb[j].first){
st_update(aa[i].second, -2);
i++;
}
int beg = i;
while(i<=n && aa[i].first==bb[j].first){
st_update(aa[i].second, -1);
i++;
}
ll qntb = bb[j].second;
ll queryb = (ll) st_query(0, n);
sum += qntb*queryb;
int k=beg;
for(; k<i; k++){
st_update(aa[k].second, +1);
}
i = beg;
}
ll mc = merge(0, n+m, c);
printf("%lldn", sum + mc);
}
return 0;
}