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 Atcoder
{
    class Program
    {
        static void Main(string[] args)
        {
            //    var data = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //    var t = data[0];
            //    var s = data[1];
            //    int[,] friens = new int[t, t];
            //    int tomo = 0;

            //    for (int i = 0; i < s; i++)
            //    {
            //        var friend = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //        friens[friend[0] - 1, friend[1] - 1] = 1;
            //        friens[friend[1] - 1, friend[0] - 1] = 1;

            //    }

            //    for (int i = 0; i < t; i++)
            //    {
            //        var x = new List<int>();
            //        var y = new List<int>();
            //        var a = new List<int>();

            //        for (int j = 0; j < t; j++)
            //        {

            //            if (friens[i, j] == 1)
            //            {
            //                x.Add(j);
            //            }

            //        }

            //        foreach (var z in x)
            //        {
            //            for (int l = 0; l < t; l++)
            //            {
            //                if (friens[z, l] == 1)
            //                {
            //                    y.Add(l);
            //                }
            //            }

            //            foreach (var m in y)
            //            {
            //                if (m != i && friens[m, i] != 1)
            //                {
            //                    a.Add(m);
            //                }
            //            }
            //        }

            //        Console.WriteLine(a.Distinct().Count());

            //    }

            //    var a = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //    var b = a[0];
            //    var c = a[1];
            //    int[] d = new int[b];
            //    int[] e = new int[b];
            //    int[] f = new int[b];
            //    int tmp = 0;
            //    int tokuten = 0;

            //    for (int i = 0; i < b; i++)
            //    {
            //        var g = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //        d[i] = g[0];
            //        e[i] = g[1];
            //        f[i] = g[2];

            //    }

            //    for (int j = 1; j <= c; j++)
            //    {
            //        for (int k = 0; k < b; k++)
            //        {
            //            if (d[k] <= j && e[k] >= j)
            //            {

            //            }
            //            else
            //            {
            //                tmp += f[k];
            //            }

            //        }
            //        tokuten = Math.Max(tokuten ,tmp);
            //        tmp = 0;
            //    }

            //    Console.WriteLine(tokuten);

            //var a = int.Parse(Console.ReadLine());
            //var b = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //Dictionary<int,int> c = new Dictionary<int,int>();
            //int d = 0;

            //int cnt = 0;

            ////for (int i = 0; i < a; i++)
            ////{
            ////    c.Add(b[i], 1);
            ////}

            //for (int i = 0; i < a; i++)
            //{
            //    d = b[i];

            //    while (d % 2 == 0)
            //    {
            //        d /= 2;
            //    }

            //    if (c.ContainsKey(d))
            //    {

            //    }
            //    else
            //    {
            //        c.Add(d, 1);
            //        cnt++;
            //    }
            //}
            //Console.WriteLine(cnt);

            //var one = Array.ConvertAll(Console.ReadLine().Split(),int.Parse);
            //var N = one[0];
            //var M = one[1];
            //List<int[]> ID= new List<int[]>();
            //List<string> Out = new List<string>();
            //int cnt = 1;
            //long now = -1;

            //for (int i = 0; i < M; i++)
            //{
            //    var morethanone = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //    ID.Add(morethanone);
            //}

            //var sortedID = ID.OrderBy(data => data[0]).ThenBy(data => data[1]);

            //var Rank = new Dictionary<string, int>();

            //foreach (var item in sortedID)
            //{

            //    if (now != -1 && item[0] != now)
            //    {
            //        cnt = 1;
            //    }

            //    now = item[0];
            //    Rank.Add(item[0].ToString() + item[1].ToString(), cnt);
            //    cnt++;
            //}

            //for (int i = 0; i < M; i++)
            //{
            //    var tmp = ID[i];
            //    string key = tmp[0].ToString() + tmp[1].ToString();
            //    string Output = tmp[0].ToString().PadLeft(6, '0') + Rank[key].ToString().PadLeft(6, '0');
            //    Console.WriteLine(Output);

            //}

            //var N = int.Parse(Console.ReadLine());
            //List<int[]> Z = new List<int[]>();
            //List<int[]> dis = new List<int[]>();
            //int X = 0;
            //int Y = 0;
            //int H = 0;


            //for (int i = 0; i < N; i++)
            //{
            //    var line = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //    Z.Add(line);
            //}

            //row
            //for (int i = 0; i < N; i++)
            //{
            //    var linedata = Z[i];
            //    //height
            //    for (int j = 0; j < 201; j++)
            //    {
            //        //x
            //        for (int k = 0; k < 101; k++)
            //        {
            //            for (int l = 0; l < 101; l++)
            //            {
            //                if ((j + linedata[2]) - Math.Abs(k - linedata[0]) - Math.Abs(l - linedata[1]) == linedata[2])
            //                {
            //                    X = k;
            //                    Y = l;
            //                    H = j;
            //                    dis.Add(new {x = X,y =Y, h =H});
            //                }
            //            }
            //        }
            //    }
            //}
            //var a = dis.GroupBy(n => n)
            //var b = a.OrderByDescending(n => n.cnt);

            //var a = Console.ReadLine().ToCharArray();
            //var b = Console.ReadLine().ToCharArray();

            ////char[] c = new char[a.Count()];
            ////char[] d = new char[a.Count()];
            //var c = new Dictionary<char, char>();
            //var d = new Dictionary<char, char>();

            //for (int i = 0; i < a.Count(); i++)
            //{
            //    if (!c.ContainsKey(a[i]))
            //    {
            //        c.Add(a[i], b[i]);
            //    }
            //    else if (c[a[i]] != b[i])
            //    {
            //        Console.WriteLine("No");
            //        return;
            //    }
            //}

            //for (int i = 0; i < b.Count(); i++)
            //{
            //    if (!d.ContainsKey(b[i]))
            //    {
            //        d.Add(b[i], a[i]);
            //    }
            //    else if (d[b[i]] != a[i])
            //    {
            //        Console.WriteLine("No");
            //        return;
            //    }
            //}
            //Console.WriteLine("Yes");

            //var line1 = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //var line2 = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //int min = int.MaxValue;
            //int min2 = int.MaxValue;
            //int amari = int.MaxValue;

            //for (int i = 0; i < line1[0]; i++)
            //{
            //    if (Math.Abs(line2[i]-line1[1]) <= min)
            //    {
            //        min2 = min;
            //        min = Math.Abs(line2[i] - line1[1]);
            //    }
            //    else if (Math.Abs(line2[i] - line1[1]) < min2)
            //    {
            //        min2 = Math.Abs(line2[i] - line1[1]);
            //    }
            //}

            //if (min2 != int.MaxValue)
            //{
            //    while (amari != 0)
            //    {
            //        amari = min2 % min;
            //        min2 = min;
            //        min = amari;
            //    }
            //    Console.WriteLine(min2);
            //}
            //else
            //{
            //    Console.WriteLine(min);
            //}


            //var line1 = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            //int N = line1[0];
            //int K = line1[1];

            //int Kgaguu = 0;
            //int amari0 = 0;


            //for (int i = 1; i <= N; i++)
            //{
            //    if (i % K == 0)
            //    {
            //        amari0++;
            //    }
            //    else if (K % 2 == 0 && i % K == K /2)
            //    {
            //        Kgaguu++;
            //    }
            //}

            //Console.WriteLine(amari0 * amari0 * amari0 + Kgaguu * Kgaguu * Kgaguu);

            var line1 = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            int N = line1[0];
            int K = line1[1];
            var line2 = Array.ConvertAll(Console.ReadLine().Split(), long.Parse);

            long mintmp = int.MaxValue;
            long min = int.MaxValue;

            for (int i = 0; i < N-K+1; i++)
            {
                var left = line2[i];
                var right = line2[i + K - 1];

                mintmp = Math.Min(Math.Min(Math.Abs(left) + Math.Abs(right - left), min), Math.Abs(right) + Math.Abs(left - right));

                min = Math.Min(mintmp, min);
            }

            //for (int i = 0; i < N; i++)
            //{
            //    if (i != 0 || i != N-1)
            //    {
            //        var tmp = new node();
            //        tmp._to1 = line2[i - 1];
            //        tmp._to2 = line2[i + 1];
            //        tmp.me = line2[i];
            //        tmp.flg = false;
            //        node.Add(tmp);
            //    }
            //}
            Console.WriteLine(min);
        }
    }
}