import std.algorithm;
import std.conv;
import std.functional;
import std.math;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nk = input.front.split.to!( long[] );
	input.popFront;
	auto xs = input.front.split.to!( long[] );
	
	return tuple( nk[ 1 ], xs );
}

auto solve( long k, long[] xs )
{
	return min(
		memoize!walkRight( k, xs, 0, false ),
		memoize!walkLeft( k, xs, 0, false )
	);
}

long walkRight( long k, long[] xs, long p, bool turned )
{
	// K本回り終わった
	if( k <= 0 ) return 0;
	
	// 正側で一番近い値の添字を検索
	auto xi = long.max;
	foreach( i, x; xs )
	{
		if( p <= x )
		{
			xi = i;
			break;
		}
	}
	
	// 折り返し済で残り本数が必要本数より少なかったら諦める
	if( turned && k < xs.length - 1 - xi ) return long.max;
	
	// 既に右端だったら折り返す
	if( xi == long.max ) return memoize!walkLeft( k, xs, p, true );
	
	// 残り本数と距離を計算
	auto k_r = k - 1;
	auto d = abs( xs[ xi ] - p );
	
	// まだ残ってるので次へ移動
	auto xs_r = xs[ 0 .. xi ] ~ xs[ xi + 1 .. $ ];
	if( turned )
	{
		auto dd = memoize!walkRight( k_r, xs_r, xs[ xi ], true );
		return ( dd != long.max ) ? d + dd : dd;
	}
	else
	{
		auto dd = min(
			memoize!walkRight( k_r, xs_r, xs[ xi ], false ),
			memoize!walkLeft( k_r, xs_r, xs[ xi ], true )
		);
		return ( dd != long.max ) ? d + dd : dd;
	}
}

long walkLeft( long k, long[] xs, long p, bool turned )
{
	// K本回り終わった
	if( k <= 0 ) return 0;
	
	// 負側で一番近い値の添字を検索
	auto xi = long.max;
	foreach_reverse( i, x; xs )
	{
		if( x <= p )
		{
			xi = i;
			break;
		}
	}
	
	// 折り返し済で残り本数が必要本数より少なかったら諦める
	if( turned && xi < k ) return long.max;
	
	// 既に左端だったら折り返す
	if( xi == long.max ) return memoize!walkRight( k, xs, p, true );
	
	// 残り本数と距離を計算
	auto k_r = k - 1;
	auto d = abs( xs[ xi ] - p );
	
	// まだ残ってるので次へ移動
	auto xs_r = xs[ 0 .. xi ] ~ xs[ xi + 1 .. $ ];
	if( turned )
	{
		auto dd = memoize!walkLeft( k_r, xs_r, xs[ xi ], true );
		return ( dd != long.max ) ? d + dd : dd;
	}
	else
	{
		auto dd = min(
			memoize!walkLeft( k_r, xs_r, xs[ xi ], false ),
			memoize!walkRight( k_r, xs_r, xs[ xi ], true )
		);
		return ( dd != long.max ) ? d + dd : dd;
	}
}
