using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace debug
{
class main
{
static void Main(string args)
{
//問題クラスを展開
ProgramE a = new ProgramE();
a.main();//実行する
}
}
//HHKB
class ProgramA
{
public void main()
{
//入力
int t = int.Parse(Console.ReadLine());
//2で割り切れれば、White、そうでなければ、Black
if (t % 2 == 0)
Console.WriteLine("White");
else
Console.WriteLine("Black");
}
}
class ProgramB
{
public void main()
{
//入力
int N = int.Parse(Console.ReadLine());
long ans = 0;
//入力、メイン
for (int i = 0; i < N; i++)
{
string t = Console.ReadLine().Split(' ');
long a = long.Parse(t[0]);
long b = long.Parse(t[1]);
ans += (a + b) * (b - a + 1) / (long)2;//和を出して足す
}
//答を出力
Console.WriteLine(ans);
}
}
class ProgramC
{
public void main()
{
//入力
int n = int.Parse(Console.ReadLine());
int x = new int[n];
int y = new int[n];
for (int i = 0;i < n;i++)
{
string a = Console.ReadLine().Split(' ');
x[i] = int.Parse(a[0]);
y[i] = int.Parse(a[1]);
}
//全探索、10の-8乗以下の差であれば答を出す。
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
for (int k = j + 1; k < n; k++)
{
double AB = Math.Sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
double BC = Math.Sqrt((x[k] - x[j]) * (x[k] - x[j]) + (y[k] - y[j]) * (y[k] - y[j]));
double CA = Math.Sqrt((x[i] - x[k]) * (x[i] - x[k]) + (y[i] - y[k]) * (y[i] - y[k]));
if (AB + BC -CA < 0.0000000001)
{
Console.WriteLine("Yes");
return;
}
if (AB - BC + CA < 0.0000000001)
{
Console.WriteLine("Yes");
return;
}
if (-AB + BC + CA < 0.0000000001)
{
Console.WriteLine("Yes");
return;
}
}
//それ以外ならNoである。
Console.WriteLine("No");
}
}
class ProgramD
{
public void main()
{
//入力
string s = Console.ReadLine();
long count = new long[9];
//文字列1文字のとき
if(s.Length == 1)
{
if (int.Parse(s) == 8)
Console.WriteLine("Yes");
else
Console.WriteLine("No");
return;
}
//文字列2文字のとき
if (s.Length == 2)
{
if (int.Parse(s) % 8 == 0)
Console.WriteLine("Yes");
else if(((s[0] - '0') + (s[1] - '0') * 10) % 8 == 0)
Console.WriteLine("Yes");
else
Console.WriteLine("No");
return;
}
//文字列で1-9の数を数える
for (int i = 0; i < s.Length; i++)
count[s[i] - '1']++;
//112から992までを数える
for(int i = 112; i < 1000;i = i + 8)
{
//百、十、一の桁を出す
int num3 = i / 100;
int num2 = i / 10 - 10 * num3;
int num1 = i - 100 * num3 - 10 * num2;
//もしどれかゼロなら条件外なので飛ばす
if (num3 == 0 || num2 == 0 || num1 == 0)
continue;
//とりあえず、引いてみる
count[num3 - 1]--;
count[num2 - 1]--;
count[num1 - 1]--;
int flag = 0;
//引いた後どれかがマイナスなら条件をみたさないので飛ばす
for (int j = 0;j < 9;j++)
{
if(count[j] < 0)
{
count[num3 - 1]++;
count[num2 - 1]++;
count[num1 - 1]++;
flag = 1;
break;
}
}
//もし条件満たすならYesで出力する
if(flag == 0)
{
Console.WriteLine("Yes");
return;
}
}
//全部満たさないならNoを出す。
Console.WriteLine("No");
}
}
class ProgramE
{
public void main()
{
//入力
string s = Console.ReadLine().Split(' ');
int N = int.Parse(s[0]);
int M = int.Parse(s[1]);
string t = Console.ReadLine().Split(' ');
long h = new long[N];
long odd = new long[(N -1)/2 + 1];
long even = new long[(N - 1) / 2 + 1];
//配列作成
for (int i = 0; i < N; i++)
h[i] = long.Parse(t[i]);
//ソートする
Array.Sort(h);
//初項はゼロで、0人選ばれたときを導入する。
odd[0] = 0;
even[0] = 0;
//身長差を偶数番目と奇数番目で分ける
for (int i = 1; i < N; i++)
{
long sa = h[i] - h[i - 1];
if (i % 2 == 1)
odd[(i + 1)/ 2] = sa + odd[(i + 1) / 2 - 1];
else
even[i / 2] = sa + even[i / 2 - 1];
}
string w = Console.ReadLine().Split(' ');
long ans = 10000000000000000;//初項は大きくしとく
for (int i = 0; i< M;i++)
{
long sum = 0;
long wn = long.Parse(w[i]);
long min = -1;
long max = N;
//二分探索法。
while (max != min + 1)
{
long temp = (max + min) / 2;
//身長が生徒より大きいときminを更新。
if (h[temp] < wn)
min = temp;
else
max = temp;
}
//先生より身長が低いときの和をもとめる
sum += odd[(min + 1) / 2];
//先生より身長が高いときの和を求める
sum += even[(N - 1) /2] - even[(min + 1) / 2];
//先生の偶奇の位置で足し合わせる
if (min % 2 == 0)
sum += wn - h[min];
else
sum += h[max] - wn;
//和が最小かどうか見る
ans = Math.Min(ans, sum);
}
//答え出力
Console.WriteLine(ans);
}
}
}