Problem:
Score : 300 points

Problem Statement

There are N candles placed on a number line.
The i-th candle from the left is placed on coordinate x_i.
Here, x_1 < x_2 < ... < x_N holds.

Initially, no candles are burning.
Snuke decides to light K of the N candles.

Now, he is at coordinate 0.
He can move left and right along the line with speed 1.
He can also light a candle when he is at the same position as the candle, in negligible time.

Find the minimum time required to light K candles.

Constraints

1 \leq N \leq 10^5

1 \leq K \leq N

x_i is an integer.

|x_i| \leq 10^8

x_1 < x_2 < ... < x_N

Input

Input is given from Standard Input in the following format:

N K
x_1 x_2 ... x_N

Output

Print the minimum time required to light K candles.

Sample Input 1

5 3
-30 -10 10 20 50

Sample Output 1

40

He should move and light candles as follows:

Move from coordinate 0 to -10.

Light the second candle from the left.

Move from coordinate -10 to 10.

Light the third candle from the left.

Move from coordinate 10 to 20.

Light the fourth candle from the left.

Sample Input 2

3 2
10 20 30

Sample Output 2

20

Sample Input 3

1 1
0

Sample Output 3

0

There may be a candle placed at coordinate 0.

Sample Input 4

8 5
-9 -7 -4 -3 1 2 3 4

Sample Output 4

10

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoder2 {
	class Program {
		static void Main(string[] args) {

	
			var inputArray = retreiveLongArray();
			var inputCount = 2;

			// 不正な入力は処理しない
			if (inputArray.Length != inputCount) {
				Console.WriteLine("invalid input");
				return;
			}
			long N = inputArray[0];
			long K = inputArray[1];

			var xArray = retreiveLongArray();

			var minDistance = long.MaxValue;

			//マイナスに往復する場合
			var minusPattern = new Dictionary<long, long>();

			for (int i = 0; i < N; i++) {

				if (xArray[i]<0) {
					minusPattern.Add(i, xArray[i] * 2);
				}
				else {
					minusPattern.Add(i, xArray[i] );
				}
			}

			//プラスに往復する場合
			var plusPattern = new Dictionary<long, long>();

			for (int i = 0; i < N; i++) {

				if (xArray[i] > 0) {
					plusPattern.Add(i, xArray[i] * 2);
				}
				else {
					plusPattern.Add(i, xArray[i]);
				}
			}


			//マイナスに往復する場合
			for (int i = 0; i < N-K+1; i++) {

				var distance =  minusPattern[i + K - 1]- minusPattern[i];

				if(minusPattern[i] * minusPattern[i + K - 1] > 0) {
					distance += Math.Min(Math.Abs(minusPattern[i]), Math.Abs(minusPattern[i + K - 1]));
				}

				minDistance = Math.Min(minDistance, distance);
			}

			//プラスに往復する場合
			for (int i = 0; i < N - K + 1; i++) {

				var distance =  plusPattern[i + K - 1]- plusPattern[i];

				//どちらも同じ側にあるときは、原点からの移動距離を追加する
				if (plusPattern[i] * plusPattern[i + K - 1] > 0) {
					distance += Math.Min(Math.Abs(plusPattern[i]), Math.Abs(plusPattern[i + K - 1]));
				}

				minDistance = Math.Min(minDistance, distance);
			}



			//答えの出力
			var ans = minDistance;
			Console.WriteLine(ans);

		}

		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static string[] retreiveStringArray() {
			var inputArray = Console.ReadLine().Split(' ');
			return inputArray;
		}

		/// <summary>
		/// スペースで区切られた整数配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] retreiveLongArray() {
			var inputArray = Console.ReadLine().Split(' ');
			var longArray = inputArray.Select(s => long.Parse(s));
			return longArray.ToArray();
		}
	}
}