#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int t = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') ch = getchar();
  while (ch <= '9' && ch >= '0') t = t * 10 + ch - '0', ch = getchar();
  return t;
}
const int _ = 2e5 + 23;
const int inf = 1e9 + 1;
int n, h[_], d[_], f[_], g[_], st[_], top;
int ans = inf << 1;
inline bool check1() {
  for (register int i = 1; i <= n; i++)
    if (2 * h[i] >= d[g[i]] - d[f[i]]) return 1;
  return 0;
}
inline void solve2() {
  for (register int i = 1; i <= n; i++) ans = min(ans, (d[g[i]] - d[f[i]]));
}
inline void solve3() {
  for (register int i = 1; i <= n; i++) {
    if (f[i] == 0 && d[g[i]] - d[i] < 2 * h[i]) ans = min(ans, (d[i] - d[0]));
    if (g[i] == n + 1 && d[i] - d[f[i]] < 2 * h[i])
      ans = min(ans, (d[n + 1] - d[i]));
  }
}
int a[_];
vector<int> v;
int cnt;
inline void add(int x, int y) {
  x = lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
  while (x) {
    a[x] = max(a[x], y), x -= x & -x;
  }
}
inline int mx(int x) {
  int maxx = 0;
  x = lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
  while (x <= cnt) {
    maxx = max(maxx, a[x]), x += x & -x;
  }
  return maxx;
}
inline void solve4() {
  memset(a, -1, sizeof(a));
  for (register int i = 1; i <= n; i++)
    if (d[i] - d[f[i]] < 2 * h[i]) v.push_back(d[f[i]] + 2 * h[i]);
  sort(v.begin(), v.end());
  cnt = unique(v.begin(), v.end()) - v.begin();
  v.resize(cnt);
  for (register int i = 1; i <= n; i++) {
    if (d[g[i]] - d[i] < 2 * h[i]) {
      int k = mx(d[g[i]] - 2 * h[i]);
      if (k != -1) ans = min(ans, (d[i] - k));
    }
    if (d[i] - d[f[i]] < 2 * h[i]) add(d[f[i]] + 2 * h[i], d[i]);
  }
  return;
}
int main() {
  n = read();
  for (register int i = 0; i <= n + 1; i++) d[i] = read();
  for (register int i = 1; i <= n; i++) h[i] = read();
  st[++top] = 0;
  for (register int i = 1; i <= n; i++) {
    while (top && d[f[st[top]]] + 2 * h[st[top]] < d[i]) top--;
    f[i] = st[top];
    while (top && d[f[st[top]]] + 2 * h[st[top]] <= d[f[i]] + 2 * h[i]) top--;
    st[++top] = i;
  }
  top = 0;
  st[++top] = n + 1;
  for (register int i = n; i >= 1; i--) {
    while (top && d[i] < d[g[st[top]]] - 2 * h[st[top]]) top--;
    g[i] = st[top];
    while (top && d[g[i]] - 2 * h[i] <= d[g[st[top]]] - 2 * h[st[top]]) top--;
    st[++top] = i;
  }
  if (check1()) {
    puts("0");
    return 0;
  }
  solve2();
  ans = min(ans, (d[n + 1] - d[0]));
  solve3();
  solve4();
  printf("%lf\n", ans / 2.000);
  return 0;
}
