#include <bits/stdc++.h>
using namespace std;
int read() {
  int i;
  scanf("%d", &i);
  return i;
}
int cs[100001];
vector<pair<int, int> > Clac(const vector<int>& x, const vector<int>& d) {
  int n = x.size();
  vector<pair<int, int> > ret(n);
  ret[0] = make_pair(x[0], d[0]);
  int k = 0;
  cs[k++] = 0;
  for (int i = 1; i < n; i++) {
    cs[k++] = i;
    while (k >= 2) {
      if (x[cs[k - 1]] - x[cs[k - 2]] >= d[cs[k - 1]])
        k--;
      else if (k >= 3 && x[cs[k - 1]] - x[cs[k - 3]] > d[cs[k - 2]]) {
        cs[k - 2] = cs[k - 1];
        k--;
      } else
        break;
    }
    if (k == 1)
      ret[i] = make_pair(x[0], d[0]);
    else
      ret[i] = make_pair(x[cs[k - 1]], d[cs[k - 1]] + x[cs[k - 2]]);
  }
  return ret;
}
int xBuf[100002], dBuf[100002];
pair<pair<int, int>, pair<int, int> > qs[400004];
int main() {
  int n = read();
  for (int i = 0; i < n + 2; i++) xBuf[i] = read();
  for (int i = 0; i < n; i++) dBuf[i] = read() * 2;
  vector<int> x1(n + 1), x2(n + 1), d1(n + 1), d2(n + 1);
  for (int i = 0; i < n + 1; i++) x1[i] = xBuf[i];
  d1[0] = INT_MAX;
  for (int i = 0; i < n; i++) d1[i + 1] = dBuf[i];
  for (int i = 0; i < n + 1; i++) x2[i] = xBuf[n + 1] - xBuf[n + 1 - i];
  d2[0] = INT_MAX;
  for (int i = 0; i < n; i++) d2[i + 1] = dBuf[n - 1 - i];
  vector<pair<int, int> > r1 = Clac(x1, d1);
  if (r1[n].first != 0 && xBuf[n + 1] <= r1[n].second) {
    printf("0\n");
    return 0;
  }
  int k = 0;
  for (auto p : r1) {
    qs[k++] = make_pair(make_pair(p.first, -1), make_pair(1, p.first));
    qs[k++] = make_pair(make_pair(p.second, -1), make_pair(2, p.first));
  }
  vector<pair<int, int> > r2 = Clac(x2, d2);
  for (auto p : r2) {
    qs[k++] = make_pair(make_pair(xBuf[n + 1] - p.second, -2),
                        make_pair(1, xBuf[n + 1] - p.first));
    qs[k++] = make_pair(make_pair(xBuf[n + 1] - p.first, -2),
                        make_pair(2, xBuf[n + 1] - p.first));
  }
  sort(qs, qs + k);
  int ans = INT_MAX;
  multiset<int> s1, s2;
  for (int i = 0; i < k; i++) {
    int type = -qs[i].first.second;
    int ad = qs[i].second.first;
    int v = qs[i].second.second;
    if (ad == 1) {
      if (type == 1)
        s1.insert(v);
      else
        s2.insert(v);
      if (!s1.empty() && !s2.empty()) {
        int u = *(--s1.end());
        int t = *s2.begin();
        ans = min(ans, t - u);
      }
    } else {
      if (type == 1)
        s1.erase(v);
      else
        s2.erase(v);
    }
  }
  printf("%.10f\n", (double)ans / 2);
}
