description: You are given two arrays of integers a_1, a_2, …, a_n and b_1, b_2, …, b_m.
  
  You need to insert all elements of b into a in an arbitrary way. As a result you will get an array c_1, c_2, …, c_{n+m} of size n + m.
  
  Note that you are not allowed to change the order of elements in a, while you can insert elements of b at arbitrary positions. They can be inserted at the beginning, between any elements of a, or at the end. Moreover, elements of b can appear in the resulting array in any order.
  
  What is the minimum possible number of inversions in the resulting array c? Recall that an inversion is a pair of indices (i, j) such that i < j and c_i > c_j.
  
  Input
  
  Each test contains multiple test cases. The first line contains the number of test cases t (1 ≤ t ≤ 10^4). Description of the test cases follows.
  
  The first line of each test case contains two integers n and m (1 ≤ n, m ≤ 10^6).
  
  The second line of each test case contains n integers a_1, a_2, …, a_n (1 ≤ a_i ≤ 10^9).
  
  The third line of each test case contains m integers b_1, b_2, …, b_m (1 ≤ b_i ≤ 10^9).
  
  It is guaranteed that the sum of n for all tests cases in one input doesn't exceed 10^6. The sum of m for all tests cases doesn't exceed 10^6 as well.
  
  Output
  
  For each test case, print one integer — the minimum possible number of inversions in the resulting array c.
  
  Example
  
  Input
  
  
  3
  3 4
  1 2 3
  4 3 2 1
  3 3
  3 2 1
  1 2 3
  5 4
  1 3 5 3 1
  4 3 6 1
  
  
  Output
  
  
  0
  4
  6
  
  Note
  
  Below is given the solution to get the optimal answer for each of the example test cases (elements of a are underscored).
  
    * In the first test case, c = [\underline{1}, 1, \underline{2}, 2, \underline{3}, 3, 4]. 
    * In the second test case, c = [1, 2, \underline{3}, \underline{2}, \underline{1}, 3]. 
    * In the third test case, c = [\underline{1}, 1, 3, \underline{3}, \underline{5}, \underline{3}, \underline{1}, 4, 6]. 
solution: //package round751;
  import java.io.*;
  import java.util.*;
  
  public class C2 {
  	InputStream is;
  	FastWriter out;
  	String INPUT = "";
  	
  	void solve()
  	{
  		for(int T = ni();T > 0;T--)go();
  	}
  
  	void go()
  	{
  		int n = ni(), m = ni();
  		int[] a = na(n);
  		int[] b = na(m);
  
  		int[] xs = new int[n+m];
  		for(int i = 0;i < n;i++){
  			xs[i] = a[i];
  		}
  		for(int i = 0;i < m;i++){
  			xs[i+n] = b[i];
  		}
  		xs = shrink(xs);
  		for(int i = 0;i < n;i++){
  			a[i] = xs[i];
  		}
  		for(int i = 0;i < m;i++){
  			b[i] = xs[i+n];
  		}
  		long base = inversion(a, n+m);
  
  		int[] f = new int[n+m];
  		for(int i = 0;i < m;i++){
  			f[xs[i+n]]++;
  		}
  
  		StarrySkyTreeL sst = new StarrySkyTreeL(n+1);
  		for(int i = 0;i < n;i++){
  			sst.add(i+1, n+1, 1);
  		}
  		long[] ai = new long[n];
  		for(int i = 0;i < n;i++){
  			ai[i] = (long)a[i]<<32|i;
  		}
  		ai = shuffle(ai, gen);
  		Arrays.sort(ai);
  		int tail = 0, head = 0;
  		long ans = base;
  		for(int h = 0;h < n+m;h++){
  			while(head < n && ai[head]>>>32 <= h){
  				sst.add((int)ai[head]+1, n+1, -1);
  				head++;
  			}
  			while(tail < n && ai[tail]>>>32 < h){
  				sst.add(0, (int)ai[tail]+1, 1);
  				tail++;
  			}
  			ans += f[h] * sst.min(0, n+1);
  		}
  		out.println(ans);
  	}
  
  	public static class StarrySkyTreeL {
  		public final int M, H, N, LH;
  		public long[] mins;
  		public long[] plus;
  		public static final long I = Long.MAX_VALUE/4; // I+plus<long
  
  		public StarrySkyTreeL(int n)
  		{
  			N = n;
  			M = Integer.highestOneBit(Math.max(n-1, 1))<<2;
  			H = M>>>1;
  			LH = Integer.numberOfTrailingZeros(H);
  			mins = new long[M];
  			plus = new long[H];
  		}
  
  		public StarrySkyTreeL(long[] a)
  		{
  			this(a.length);
  			for(int i = 0;i < N;i++){
  				mins[H+i] = a[i];
  			}
  			Arrays.fill(mins, H+N, M, I);
  			for(int i = H-1;i >= 1;i--)propagate(i);
  		}
  
  		private void push1(int cur)
  		{
  			if(plus[cur] == 0)return;
  			int L = cur*2, R = L + 1;
  			mins[L] += plus[cur];
  			mins[R] += plus[cur];
  			if(L < H){
  				plus[L] += plus[cur];
  				plus[R] += plus[cur];
  			}
  			plus[cur] = 0;
  		}
  
  		private void propagate(int i)
  		{
  			mins[i] = Math.min(mins[2*i], mins[2*i+1]) + plus[i];
  		}
  
  		private void add1(int cur, long v)
  		{
  			mins[cur] += v;
  			if(cur < H){
  				plus[cur] += v;
  			}
  		}
  
  		private void push(int l, int r)
  		{
  			for(int i = LH;i >= 1;i--) {
  				if (l >>> i << i != l) push1(l >>> i);
  				if (r >>> i << i != r) push1(r >>> i);
  			}
  		}
  
  		public void add(int l, int r, long v)
  		{
  			if(l >= r)return;
  			l += H; r += H;
  			push(l, r);
  			for(int ll = l, rr = r;ll < rr;ll>>>=1,rr>>>=1){
  				if((ll&1) == 1) add1(ll++, v);
  				if((rr&1) == 1) add1(--rr, v);
  			}
  			for(int i = 1;i <= LH;i++){
  				if(l>>>i<<i != l)propagate(l>>>i);
  				if(r>>>i<<i != r)propagate(r>>>i);
  			}
  		}
  
  		public long min(int l, int r){
  			long min = I;
  			if(l >= r)return min;
  			l += H; r += H;
  			push(l, r);
  			for(;l < r;l>>>=1,r>>>=1){
  				if((l&1) == 1)min = Math.min(min, mins[l++]);
  				if((r&1) == 1)min = Math.min(min, mins[--r]);
  			}
  			return min;
  		}
  
  		public int firstle(int l, long v) {
  			if(l >= H)return -1;
  			int cur = H+l;
  			for(int i = 1, j = Integer.numberOfTrailingZeros(H)-1;i <= cur;j--){
  				push1(i);
  				i = i*2|cur>>>j&1;
  			}
  			while(true){
  				push1(cur);
  				if(mins[cur] <= v){
  					if(cur >= H)return cur-H;
  					cur = 2*cur;
  				}else{
  					cur++;
  					if((cur&cur-1) == 0)return -1;
  					cur = cur>>>Integer.numberOfTrailingZeros(cur);
  				}
  			}
  		}
  
  		public int lastle(int l, long v) {
  			if(l < 0)return -1;
  			int cur = H+l;
  			for(int i = 1, j = Integer.numberOfTrailingZeros(H)-1;i <= cur;j--){
  				push1(i);
  				i = i*2|cur>>>j&1;
  			}
  			while(true){
  				push1(cur);
  				if(mins[cur] <= v){
  					if(cur >= H)return cur-H;
  					cur = 2*cur+1;
  				}else{
  					if((cur&cur-1) == 0)return -1;
  					cur = cur>>>Integer.numberOfTrailingZeros(cur);
  					cur--;
  				}
  			}
  		}
  
  		public long[] toArray() { return toArray(1, 0, H, new long[H]); }
  
  		private long[] toArray(int cur, int l, int r, long[] ret)
  		{
  			if(r-l == 1){
  				ret[cur-H] = mins[cur];
  			}else{
  				toArray(2*cur, l, l+r>>>1, ret);
  				toArray(2*cur+1, l+r>>>1, r, ret);
  				for(int i = l;i < r;i++)ret[i] += plus[cur];
  			}
  			return ret;
  		}
  	}
  
  
  	public static long inversion(int[] a, int u)
  	{
  		int n = a.length;
  		int[] ft = new int[u+3];
  		long inv = 0;
  		for(int i = n-1;i >= 0;i--){
  			inv += sumFenwick(ft, a[i]-1);
  			addFenwick(ft, a[i], 1);
  		}
  		return inv;
  	}
  
  	public static int sumFenwick(int[] ft, int i)
  	{
  		int sum = 0;
  		for(i++;i > 0;i -= i&-i)sum += ft[i];
  		return sum;
  	}
  
  	public static void addFenwick(int[] ft, int l, int r, int v)
  	{
  		addFenwick(ft, l, v);
  		addFenwick(ft, r, -v);
  	}
  
  	public static void addFenwick(int[] ft, int i, int v)
  	{
  		if(v == 0 || i < 0)return;
  		int n = ft.length;
  		for(i++;i < n;i += i&-i)ft[i] += v;
  	}
  
  
  
  	static Random gen = new Random();
  
  //	public static int[] shrink(int[] a)
  //	{
  //		int n = a.length;
  //		int[] b = Arrays.copyOf(a, n);
  //		b = shuffle(b, gen);
  //		Arrays.sort(b);
  //		int p = 1;
  //		for(int i = 1;i < n;i++){
  //			if(b[i] != b[i-1]){
  //				b[p++] = b[i];
  //			}
  //		}
  //		int[] ret = new int[n];
  //		for(int i = 0;i < n;i++) {
  //			ret[i] = Arrays.binarySearch(b, 0, p, a[i]);
  //		}
  //		return ret;
  //	}
  
  	public static int[] shrink(int[] a)
  	{
  		int n = a.length;
  		long[] b = new long[n];
  		for(int i = 0;i < n;i++)b[i] = (long)a[i]<<32|i;
  		b = shuffle(b, gen);
  		Arrays.sort(b);
  		int[] ret = new int[n];
  		int p = 0;
  		for(int i = 0;i < n;i++) {
  			if(i>0 && (b[i]^b[i-1])>>32!=0)p++;
  			ret[(int)b[i]] = p;
  		}
  		return ret;
  	}
  //
  	public static int[] shuffle(int[] a, Random gen){ for(int i = 0, n = a.length;i < n;i++){ int ind = gen.nextInt(n-i)+i; int d = a[i]; a[i] = a[ind]; a[ind] = d; } return a; }
  	public static long[] shuffle(long[] a, Random gen){ for(int i = 0, n = a.length;i < n;i++){ int ind = gen.nextInt(n-i)+i; long d = a[i]; a[i] = a[ind]; a[ind] = d; } return a; }
  
  
  
  
  	void run() throws Exception
  	{
  		is = oj ? System.in : new ByteArrayInputStream(INPUT.getBytes());
  		out = new FastWriter(System.out);
  		
  		long s = System.currentTimeMillis();
  		solve();
  		out.flush();
  		tr(System.currentTimeMillis()-s+"ms");
  	}
  	
  	public static void main(String[] args) throws Exception { new C2().run(); }
  	
  	private byte[] inbuf = new byte[1024];
  	public int lenbuf = 0, ptrbuf = 0;
  	
  	private int readByte()
  	{
  		if(lenbuf == -1)throw new InputMismatchException();
  		if(ptrbuf >= lenbuf){
  			ptrbuf = 0;
  			try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
  			if(lenbuf <= 0)return -1;
  		}
  		return inbuf[ptrbuf++];
  	}
  	
  	private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
  	private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
  	
  	private double nd() { return Double.parseDouble(ns()); }
  	private char nc() { return (char)skip(); }
  	
  	private String ns()
  	{
  		int b = skip();
  		StringBuilder sb = new StringBuilder();
  		while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
  			sb.appendCodePoint(b);
  			b = readByte();
  		}
  		return sb.toString();
  	}
  	
  	private char[] ns(int n)
  	{
  		char[] buf = new char[n];
  		int b = skip(), p = 0;
  		while(p < n && !(isSpaceChar(b))){
  			buf[p++] = (char)b;
  			b = readByte();
  		}
  		return n == p ? buf : Arrays.copyOf(buf, p);
  	}
  
  	private int[] na(int n)
  	{
  		int[] a = new int[n];
  		for(int i = 0;i < n;i++)a[i] = ni();
  		return a;
  	}
  
  	private long[] nal(int n)
  	{
  		long[] a = new long[n];
  		for(int i = 0;i < n;i++)a[i] = nl();
  		return a;
  	}
  
  	private char[][] nm(int n, int m) {
  		char[][] map = new char[n][];
  		for(int i = 0;i < n;i++)map[i] = ns(m);
  		return map;
  	}
  
  	private int[][] nmi(int n, int m) {
  		int[][] map = new int[n][];
  		for(int i = 0;i < n;i++)map[i] = na(m);
  		return map;
  	}
  
  	private int ni() { return (int)nl(); }
  
  	private long nl()
  	{
  		long num = 0;
  		int b;
  		boolean minus = false;
  		while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
  		if(b == '-'){
  			minus = true;
  			b = readByte();
  		}
  
  		while(true){
  			if(b >= '0' && b <= '9'){
  				num = num * 10 + (b - '0');
  			}else{
  				return minus ? -num : num;
  			}
  			b = readByte();
  		}
  	}
  
  	public static class FastWriter
  	{
  		private static final int BUF_SIZE = 1<<13;
  		private final byte[] buf = new byte[BUF_SIZE];
  		private final OutputStream out;
  		private int ptr = 0;
  
  		private FastWriter(){out = null;}
  
  		public FastWriter(OutputStream os)
  		{
  			this.out = os;
  		}
  
  		public FastWriter(String path)
  		{
  			try {
  				this.out = new FileOutputStream(path);
  			} catch (FileNotFoundException e) {
  				throw new RuntimeException("FastWriter");
  			}
  		}
  
  		public FastWriter write(byte b)
  		{
  			buf[ptr++] = b;
  			if(ptr == BUF_SIZE)innerflush();
  			return this;
  		}
  
  		public FastWriter write(char c)
  		{
  			return write((byte)c);
  		}
  
  		public FastWriter write(char[] s)
  		{
  			for(char c : s){
  				buf[ptr++] = (byte)c;
  				if(ptr == BUF_SIZE)innerflush();
  			}
  			return this;
  		}
  
  		public FastWriter write(String s)
  		{
  			s.chars().forEach(c -> {
  				buf[ptr++] = (byte)c;
  				if(ptr == BUF_SIZE)innerflush();
  			});
  			return this;
  		}
  
  		private static int countDigits(int l) {
  			if (l >= 1000000000) return 10;
  			if (l >= 100000000) return 9;
  			if (l >= 10000000) return 8;
  			if (l >= 1000000) return 7;
  			if (l >= 100000) return 6;
  			if (l >= 10000) return 5;
  			if (l >= 1000) return 4;
  			if (l >= 100) return 3;
  			if (l >= 10) return 2;
  			return 1;
  		}
  
  		public FastWriter write(int x)
  		{
  			if(x == Integer.MIN_VALUE){
  				return write((long)x);
  			}
  			if(ptr + 12 >= BUF_SIZE)innerflush();
  			if(x < 0){
  				write((byte)'-');
  				x = -x;
  			}
  			int d = countDigits(x);
  			for(int i = ptr + d - 1;i >= ptr;i--){
  				buf[i] = (byte)('0'+x%10);
  				x /= 10;
  			}
  			ptr += d;
  			return this;
  		}
  
  		private static int countDigits(long l) {
  			if (l >= 1000000000000000000L) return 19;
  			if (l >= 100000000000000000L) return 18;
  			if (l >= 10000000000000000L) return 17;
  			if (l >= 1000000000000000L) return 16;
  			if (l >= 100000000000000L) return 15;
  			if (l >= 10000000000000L) return 14;
  			if (l >= 1000000000000L) return 13;
  			if (l >= 100000000000L) return 12;
  			if (l >= 10000000000L) return 11;
  			if (l >= 1000000000L) return 10;
  			if (l >= 100000000L) return 9;
  			if (l >= 10000000L) return 8;
  			if (l >= 1000000L) return 7;
  			if (l >= 100000L) return 6;
  			if (l >= 10000L) return 5;
  			if (l >= 1000L) return 4;
  			if (l >= 100L) return 3;
  			if (l >= 10L) return 2;
  			return 1;
  		}
  
  		public FastWriter write(long x)
  		{
  			if(x == Long.MIN_VALUE){
  				return write("" + x);
  			}
  			if(ptr + 21 >= BUF_SIZE)innerflush();
  			if(x < 0){
  				write((byte)'-');
  				x = -x;
  			}
  			int d = countDigits(x);
  			for(int i = ptr + d - 1;i >= ptr;i--){
  				buf[i] = (byte)('0'+x%10);
  				x /= 10;
  			}
  			ptr += d;
  			return this;
  		}
  
  		public FastWriter write(double x, int precision)
  		{
  			if(x < 0){
  				write('-');
  				x = -x;
  			}
  			x += Math.pow(10, -precision)/2;
  			//		if(x < 0){ x = 0; }
  			write((long)x).write(".");
  			x -= (long)x;
  			for(int i = 0;i < precision;i++){
  				x *= 10;
  				write((char)('0'+(int)x));
  				x -= (int)x;
  			}
  			return this;
  		}
  
  		public FastWriter writeln(char c){
  			return write(c).writeln();
  		}
  
  		public FastWriter writeln(int x){
  			return write(x).writeln();
  		}
  
  		public FastWriter writeln(long x){
  			return write(x).writeln();
  		}
  
  		public FastWriter writeln(double x, int precision){
  			return write(x, precision).writeln();
  		}
  
  		public FastWriter write(int... xs)
  		{
  			boolean first = true;
  			for(int x : xs) {
  				if (!first) write(' ');
  				first = false;
  				write(x);
  			}
  			return this;
  		}
  
  		public FastWriter write(long... xs)
  		{
  			boolean first = true;
  			for(long x : xs) {
  				if (!first) write(' ');
  				first = false;
  				write(x);
  			}
  			return this;
  		}
  
  		public FastWriter writeln()
  		{
  			return write((byte)'\n');
  		}
  
  		public FastWriter writeln(int... xs)
  		{
  			return write(xs).writeln();
  		}
  
  		public FastWriter writeln(long... xs)
  		{
  			return write(xs).writeln();
  		}
  
  		public FastWriter writeln(char[] line)
  		{
  			return write(line).writeln();
  		}
  
  		public FastWriter writeln(char[]... map)
  		{
  			for(char[] line : map)write(line).writeln();
  			return this;
  		}
  
  		public FastWriter writeln(String s)
  		{
  			return write(s).writeln();
  		}
  
  		private void innerflush()
  		{
  			try {
  				out.write(buf, 0, ptr);
  				ptr = 0;
  			} catch (IOException e) {
  				throw new RuntimeException("innerflush");
  			}
  		}
  
  		public void flush()
  		{
  			innerflush();
  			try {
  				out.flush();
  			} catch (IOException e) {
  				throw new RuntimeException("flush");
  			}
  		}
  
  		public FastWriter print(byte b) { return write(b); }
  		public FastWriter print(char c) { return write(c); }
  		public FastWriter print(char[] s) { return write(s); }
  		public FastWriter print(String s) { return write(s); }
  		public FastWriter print(int x) { return write(x); }
  		public FastWriter print(long x) { return write(x); }
  		public FastWriter print(double x, int precision) { return write(x, precision); }
  		public FastWriter println(char c){ return writeln(c); }
  		public FastWriter println(int x){ return writeln(x); }
  		public FastWriter println(long x){ return writeln(x); }
  		public FastWriter println(double x, int precision){ return writeln(x, precision); }
  		public FastWriter print(int... xs) { return write(xs); }
  		public FastWriter print(long... xs) { return write(xs); }
  		public FastWriter println(int... xs) { return writeln(xs); }
  		public FastWriter println(long... xs) { return writeln(xs); }
  		public FastWriter println(char[] line) { return writeln(line); }
  		public FastWriter println(char[]... map) { return writeln(map); }
  		public FastWriter println(String s) { return writeln(s); }
  		public FastWriter println() { return writeln(); }
  	}
  
  	public void trnz(int... o)
  	{
  		for(int i = 0;i < o.length;i++)if(o[i] != 0)System.out.print(i+":"+o[i]+" ");
  		System.out.println();
  	}
  
  	// print ids which are 1
  	public void trt(long... o)
  	{
  		Queue<Integer> stands = new ArrayDeque<>();
  		for(int i = 0;i < o.length;i++){
  			for(long x = o[i];x != 0;x &= x-1)stands.add(i<<6|Long.numberOfTrailingZeros(x));
  		}
  		System.out.println(stands);
  	}
  
  	public void tf(boolean... r)
  	{
  		for(boolean x : r)System.out.print(x?'#':'.');
  		System.out.println();
  	}
  
  	public void tf(boolean[]... b)
  	{
  		for(boolean[] r : b) {
  			for(boolean x : r)System.out.print(x?'#':'.');
  			System.out.println();
  		}
  		System.out.println();
  	}
  
  	public void tf(long[]... b)
  	{
  		if(INPUT.length() != 0) {
  			for (long[] r : b) {
  				for (long x : r) {
  					for (int i = 0; i < 64; i++) {
  						System.out.print(x << ~i < 0 ? '#' : '.');
  					}
  				}
  				System.out.println();
  			}
  			System.out.println();
  		}
  	}
  
  	public void tf(long... b)
  	{
  		if(INPUT.length() != 0) {
  			for (long x : b) {
  				for (int i = 0; i < 64; i++) {
  					System.out.print(x << ~i < 0 ? '#' : '.');
  				}
  			}
  			System.out.println();
  		}
  	}
  
  	private boolean oj = System.getProperty("ONLINE_JUDGE") != null;
  	private void tr(Object... o) { if(!oj)System.out.println(Arrays.deepToString(o)); }
  }
  