#include <bits/stdc++.h>

#define FILENAME "MAIN"
#define ll long long 
#define el cout << '\n'
#define ii pair<ll, ll>
#define fi first 
#define se second 
#define pb push_back
#define YES cout << "YES", el
#define NO cout << "NO", el
#define print_type cout
#define print_el print_type << '\n'
#define DEBUG(...) [](auto && ... x) {int i = 0; ((print_type << (i++ ? " " : "") << x), ...), print_el;} (__VA_ARGS__)
#define bit(mask, i) (((mask) >> (i)) & 1)
#define BIT(n) (1ll << (n))

using namespace std;

const bool is_brute = 0;
const bool multi_test = 1;

const int maxn = 1e6;
const int INF = 1e9;

struct FenwickTree
{
    int maxn;
    vector<int> bit;

    FenwickTree() {};
    FenwickTree(int maxn) : maxn(maxn)
    {
        bit.assign(maxn + 10, 0);
    }
    void update(int x, int val)
    {
        for (; x <= maxn; x += x &- x)
            bit[x] += val;
    }
    int get(int x)
    {
        int ans = 0;
        for (; x; x &= x - 1)
            ans += bit[x];
        return ans;
    }
    int getPrefix(int x)
    {
        return get(x);
    }
    int getSuffix(int x)
    {
        return get(maxn) - get(x - 1);
    }
};

int n, m, a[maxn + 10], b[maxn + 10];
ll ans = 0;
FenwickTree treePrefix, treeSuffix;
vector<int> val;

int getID(int x)
{
    return lower_bound(val.begin(), val.end(), x) - val.begin() + 1;
}
void dnc(int l, int r, int optl, int optr)
{
    if (r < l)
        return ;
    int m = l + r >> 1;
    ii best = ii(INF, INF);
    for (int i = optl; i <= optr; i++)
    {
        treeSuffix.update(a[i], -1);
        treePrefix.update(a[i], 1);
        best = min(best, ii(treePrefix.getSuffix(b[m] + 1) + treeSuffix.getPrefix(b[m] - 1), i));
    }
    ans += best.fi;
    for (int i = optl; i <= optr; i++)
    {
        treePrefix.update(a[i], -1);
        treeSuffix.update(a[i], 1);
    }
    dnc(l, m - 1, optl, best.se);
    for (int i = optl; i <= best.se - 1; i++)
    {
        treePrefix.update(a[i], 1);
        treeSuffix.update(a[i], -1);
    }
    dnc(m + 1, r, best.se, optr);
    for (int i = optl; i <= best.se - 1; i++)
    {
        treePrefix.update(a[i], -1);
        treeSuffix.update(a[i], 1);
    }
}

void solve()
{
    ans = 0;
    cin >> n >> m;
    val.clear();
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        val.push_back(a[i]);
    }
    for (int i = 1; i <= m; i++)
    {
        cin >> b[i];
        val.push_back(b[i]);
    }
    val.push_back(0);
    sort(val.begin(), val.end());
    val.resize(unique(val.begin(), val.end()) - val.begin());
    sort(b + 1, b + m + 1);
    a[0] = 0;
    for (int i = 0; i <= n; i++)
        a[i] = getID(a[i]);
    for (int i = 1; i <= m; i++)
        b[i] = getID(b[i]);
    treePrefix = treeSuffix = FenwickTree(val.size());
    for (int i = 0; i <= n; i++)
    {
        ans += treeSuffix.getSuffix(a[i] + 1);
        treeSuffix.update(a[i], 1);
    }
    dnc(1, m, 0, n);
    cout << ans, el;
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if (fopen(FILENAME".INP", "r"))
    {
        freopen(FILENAME".INP", "r", stdin);
        if (is_brute)
            freopen(FILENAME"_TRAU.OUT", "w", stdout);
        else
            freopen(FILENAME".OUT", "w", stdout);
    }

    int ntest;
    if (multi_test)
        cin >> ntest;
    else
        ntest = 1;
    for (int itest = 1; itest <= ntest; itest++)
    {
        // cout << itest, el;
        solve();
    }
}