#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
struct segt {
  int dat[262144];
  segt() { memset(dat, -1, sizeof(dat)); }
  void modify(int id, int val) {
    for (id += 131072; id > 0; id >>= 1) dat[id] = max(dat[id], val);
  }
  int query(int l, int r) {
    int ret = -1;
    for (l += 131072, r += 131072; l < r; l = (l + 1) >> 1, r = (r - 1) >> 1)
      ret = max(ret, max(dat[l], dat[r]));
    if (l == r) ret = max(ret, dat[l]);
    return ret;
  }
} tre;
int n, x[100005], d[100005];
int dpl[100005], dpr[100005];
vector<int> rem[100005];
set<int> S;
int rp[100005], lp[100005];
vector<int> hv;
int main() {
  scanf("%d", &n);
  for (int i = 0; i < (int)(n + 2); i++) scanf("%d", &x[i]);
  for (int i = 1; i <= (int)(n); i++) {
    scanf("%d", &d[i]);
    d[i] = min(d[i] * 2, x[n + 1]);
  }
  d[0] = d[n + 1] = INF;
  dpl[0] = 0;
  S.insert(0);
  for (int i = 1; i <= (int)(n + 1); i++) {
    for (int j = 0; j < (int)(rem[i].size()); j++) S.erase(rem[i][j]);
    dpl[i] = *S.rbegin();
    if (x[i] - x[dpl[i]] >= d[i])
      dpl[i] = -1;
    else {
      S.insert(i);
      rem[upper_bound(x, x + n + 2, x[dpl[i]] + d[i]) - x].push_back(i);
    }
  }
  if (dpl[n + 1] != 0) {
    printf("0\n");
    return 0;
  }
  S.clear();
  for (int i = 0; i < (int)(n + 2); i++) rem[i].clear();
  dpr[n + 1] = n + 1;
  S.insert(n + 1);
  for (int i = n; i >= 0; i--) {
    dpr[i] = *S.begin();
    if (x[dpr[i]] - x[i] >= d[i])
      dpr[i] = -1;
    else {
      S.insert(i);
      rem[lower_bound(x, x + n + 2, x[dpr[i]] - d[i]) - x].push_back(i);
    }
    for (int j = 0; j < (int)(rem[i].size()); j++) S.erase(rem[i][j]);
  }
  for (int i = 0; i < (int)(n + 2); i++) {
    rp[i] = dpl[i] == -1 ? -1 : min(x[dpl[i]] + d[i], x[n + 1]);
    lp[i] = dpr[i] == -1 ? INF : max(x[dpr[i]] - d[i], 0);
  }
  for (int i = 0; i < (int)(n + 2); i++) hv.push_back(rp[i]);
  sort(hv.begin(), hv.end());
  hv.resize(unique(hv.begin(), hv.end()) - hv.begin());
  for (int i = 0; i < (int)(n + 2); i++) {
    rp[i] = lower_bound(hv.begin(), hv.end(), rp[i]) - hv.begin();
    lp[i] = lower_bound(hv.begin(), hv.end(), lp[i]) - hv.begin();
  }
  int ans = INF;
  for (int i = 0; i < (int)(n + 2); i++) {
    int cq = tre.query(lp[i], 131071);
    if (cq != -1) ans = min(ans, x[i] - x[cq]);
    tre.modify(rp[i], i);
  }
  printf("%.10lf\n", 0.5 * ans);
  return 0;
}
