#include <bits/stdc++.h>
using namespace std;
int n, k, tx;
double x[1000010], xx, yy, l = 1e9, r = -1e9;
double dis(double x1, double y1, double x2, double y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
double getdis(double l, double r) {
  double dis1 = dis(xx, yy, l, 0);
  double dis2 = dis(xx, yy, r, 0);
  return (dis1 < dis2) ? (dis1 + r - l) : (dis2 + r - l);
}
double solve() {
  if (k == n + 1) return getdis(l, r);
  double ans = 1e12;
  if (l == tx) {
    for (int i = 2; i <= n - 1; i++)
      ans = min(ans, x[i] - l + dis(x[i], 0, xx, yy) + getdis(x[i + 1], r));
    ans = min(ans, dis(l, 0, xx, yy) + getdis(x[2], r));
    ans = min(ans, r - l + dis(r, 0, xx, yy));
    return ans;
  }
  if (r == tx) {
    for (int i = 2; i <= n - 1; i++)
      ans = min(ans, r - x[i] + dis(x[i], 0, xx, yy) + getdis(l, x[i - 1]));
    ans = min(ans, dis(r, 0, xx, yy) + getdis(l, x[n - 1]));
    ans = min(ans, r - l + dis(l, 0, xx, yy));
    return ans;
  }
  for (int i = 2; i <= n - 1; i++) {
    if (x[i] < tx) {
      ans = min(ans,
                r - tx + r - x[i] + dis(x[i], 0, xx, yy) + getdis(l, x[i - 1]));
      ans = min(ans,
                tx - x[i] + r - x[i] + dis(r, 0, xx, yy) + getdis(l, x[i - 1]));
    } else if (x[i] == tx) {
      ans = min(ans, r - tx + dis(r, 0, xx, yy) + getdis(l, x[i - 1]));
      ans = min(ans, tx - l + dis(l, 0, xx, yy) + getdis(x[i + 1], r));
    } else {
      ans = min(ans,
                tx - l + x[i] - l + dis(x[i], 0, xx, yy) + getdis(x[i + 1], r));
      ans = min(ans,
                x[i] - tx + x[i] - l + dis(l, 0, xx, yy) + getdis(x[i + 1], r));
    }
  }
  ans = min(ans, r - tx + r - l + dis(l, 0, xx, yy));
  ans = min(ans, tx - l + r - l + dis(r, 0, xx, yy));
  return ans;
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%lf", &x[i]);
    r = max(r, x[i]);
    l = min(l, x[i]);
  }
  tx = x[k];
  sort(x + 1, x + n + 1);
  scanf("%lf%lf", &xx, &yy);
  printf("%.20f", solve());
  return 0;
}
