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++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include<bits/stdc++.h>
#define N 100005
#define pr tuple<int,int,int>
#define int long long
using namespace std;

inline bool rd(int &X)
{
    X=0;int w=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while( isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    X=w?-X:X; return 1;
}

int n,k,now;
int a[N];
map< pr,int> f;

int dp(int x,int m,int pd)
{
  if(m==k) return 0;
  if(f[pr(x,m,pd)]) return f[pr(x,m,pd)];
  int r1,r2;
  if(!m) r1=x-1,r2=x;
  else if(pd) r1=x-m,r2=x+1;
  else r1=x-1,r2=x+m;
  int nx= m==0 ? 0 : a[x];
  int t=2e15;
  if(r1) t=min(t,dp(r1,m+1,0)+nx-a[r1]);
  if(r2<=n) t=min(t,dp(r2,m+1,1)+a[r2]-nx);
  //printf("x=%lld,m=%lld,t=%lld\n",x,m,t);
  return f[pr(x,m,pd)]=t;
}

signed main()
{
    rd(n);rd(k);
    for(int i=1;i<=n;i++)
    {
      rd(a[i]);
      if(a[i]>=0 and !now)
        now=i;
    }
    printf("%lld\n",dp(now,0,1));
}