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

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
int acs(const void *a, const void *b){return *(int*)a - *(int*)b;} /* 1,2,3,4.. */
int des(const void *a, const void *b){return *(int*)b - *(int*)a;} /* 8,7,6,5.. */
int cmp_char(const void *a, const void *b){return *(char*)a - *(char*)b;} /* a,b,c,d.. */
int cmp_str(const void *a, const void *b){return strcmp(*(const char **)a, *(const char **)b);} /* aaa,aab.. */
#define min(a,b) (a < b ? a: b)
#define max(a,b) (a > b ? a: b)
#define rep(i, l, r) for (int i = l; i < r; i++)
#define MAX 1000005
#define MOD 1000000007

typedef long long int lli;


// 優先度付きキュー Priority Queue

typedef struct
{
  long long int pri;
  long long int val;
} que;

que pq[MAX];
int pq_size = 0; // 最大要素

void PQadd(long long int pri, long long int val)
{
  int last = ++pq_size;
  que new;
  new.pri = pri;
  new.val = val;
  pq[pq_size] = new;

  while (last > 1 && pq[last].pri < pq[last / 2].pri)
  {
    que temp;
    temp = pq[last];
    pq[last] = pq[last / 2];
    pq[last / 2] = temp;
    last /= 2;
  }
  return;
}

que PQget(void)
{
  que root = pq[1];
  pq[1] = pq[pq_size--];

  int last = 1, bigger_child;
  while (last * 2 <= pq_size)
  {
    if (last * 2 == pq_size)
      bigger_child = last * 2;
    else
      bigger_child = pq[last * 2].pri < pq[last * 2 + 1].pri ? last * 2 : last * 2 + 1;

    if (pq[last].pri > pq[bigger_child].pri)
    {
      que temp;
      temp = pq[last];
      pq[last] = pq[bigger_child];
      pq[bigger_child] = temp;
      last = bigger_child;
    }
    else
      break;
  }
  return root;
}


int main(void) {
  int N, K;
  scanf("%d %d", &N, &K);
  lli x[MAX], size = 0;
  int o; // 座標０の添字
  lli prev = -MOD;
  rep(i, 0, N) {
    scanf("%lld", &x[size]);
    size++;
    if (x[size - 1] > 0 && prev < 0) {
      x[size] = x[size - 1];
      x[size - 1] = 0;
      o = size - 1;
      size++;
    } else if (x[size - 1] == 0) {
      o = size - 1;
    }
    prev = x[size - 1];
  }

  int ans, left, right;
  // 左に進む場合(右が戻る)
  for (int xi = o - 1; xi >= 0; xi--) { // 左
    PQadd(abs(x[xi]), 0);
  }
  for (int xi = o + 1; xi < size; xi++) { // 右
    PQadd(abs(x[xi]) * 2, 1);
  }

  left = 0; right = 0;
  rep(ki, 0, K) {
    que min = PQget();
    if ( min.val == 0 ) {
      left = min.pri;
    } else {
      right = min.pri;
    }
  }
  ans = left + right;

  pq_size = 0;
  // 右に進む場合(左が戻る)
  for (int xi = o + 1; xi < size; xi++) { // 右
    PQadd(abs(x[xi]), 1);
  }
  for (int xi = o - 1; xi >= 0; xi--) { // 左
    PQadd(abs(x[xi]) * 2, 0);
  }

  left = 0; right = 0;
  rep(ki, 0, K) {
    que min = PQget();
    if ( min.val == 0 ) {
      left = min.pri;
    } else {
      right = min.pri;
    }
  }
  ans = min(ans, left + right);

  // rep(i, 0, size) printf("%d ", x[i]);
  // printf("\n");
  // printf("o = %d\n", o);
  printf("%d\n", ans);
  return 0;
}