#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
long long n, l[MAXN], r[MAXN], vall[MAXN], valr[MAXN], pos[MAXN], d[MAXN],
    tree[4 * MAXN], ind[MAXN];
bool validl[MAXN], validr[MAXN], dead;
pair<long long, long long> sortr[MAXN];
void computeleft() {
  l[0] = -1, r[0] = 1, r[n + 1] = -1, l[n + 1] = n;
  for (int i = 1; i <= n; ++i) l[i] = i - 1, r[i] = i + 1;
  validl[0] = 1, vall[0] = 2 * d[0];
  for (int i = 1; i <= n + 1; ++i) {
    queue<int> drop;
    if ((i > 1) && (pos[r[i - 1]] - pos[l[i - 1]] > 2 * d[i - 1]))
      drop.push(i - 1);
    while (!drop.empty()) {
      int t = drop.front();
      drop.pop();
      int lt = l[t], rt = r[t];
      r[lt] = r[t];
      l[rt] = l[t];
      if (lt != 0) {
        if (pos[r[lt]] - pos[l[lt]] > 2 * d[lt]) drop.push(lt);
      }
      if (rt != i) {
        if (pos[r[rt]] - pos[l[rt]] > 2 * d[rt]) drop.push(rt);
      }
    }
    if (2 * d[i] - (pos[i] - pos[l[i]]) > 0) validl[i] = 1;
    vall[i] = 2 * d[i] + pos[l[i]];
  }
  if (r[0] != n + 1) {
    cout << "0.0\n";
    exit(0);
  }
}
void computeright() {
  l[0] = -1, r[0] = 1, r[n + 1] = -1, l[n + 1] = n;
  for (int i = 1; i <= n; ++i) l[i] = i - 1, r[i] = i + 1;
  validr[n + 1] = 1, valr[n + 1] = pos[n + 1] - 2 * d[n + 1];
  for (int i = n; i >= 1; --i) {
    queue<int> drop;
    if ((i < n) && (pos[r[i + 1]] - pos[l[i + 1]] > 2 * d[i + 1]))
      drop.push(i + 1);
    while (!drop.empty()) {
      int t = drop.front();
      drop.pop();
      int lt = l[t], rt = r[t];
      r[lt] = r[t];
      l[rt] = l[t];
      if (lt != i) {
        if (pos[r[lt]] - pos[l[lt]] > 2 * d[lt]) drop.push(lt);
      }
      if (rt != n + 1) {
        if (pos[r[rt]] - pos[l[rt]] > 2 * d[rt]) drop.push(rt);
      }
    }
    if (2 * d[i] - (pos[r[i]] - pos[i]) > 0) validr[i] = 1;
    valr[i] = pos[r[i]] - 2 * d[i];
  }
}
void init(int l = 0, int r = n, int node = 1) {
  if (l == r) {
    tree[node] = 1e9 + 5;
    return;
  }
  int mid = (l + r) / 2;
  init(l, mid, 2 * node);
  init(mid + 1, r, 2 * node + 1);
  tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}
int findmin(int a, int b, int l = 0, int r = n, int node = 1) {
  if (a == l && b == r) return tree[node];
  int mid = (l + r) / 2;
  if (b <= mid) return findmin(a, b, l, mid, 2 * node);
  if (a >= mid + 1) return findmin(a, b, mid + 1, r, 2 * node + 1);
  return min(findmin(a, mid, l, mid, 2 * node),
             findmin(mid + 1, b, mid + 1, r, 2 * node + 1));
}
void upd(int v, int x, int l = 0, int r = n, int node = 1) {
  if (l == r) {
    tree[node] = x;
    return;
  }
  int mid = (l + r) / 2;
  if (v <= mid)
    upd(v, x, l, mid, 2 * node);
  else
    upd(v, x, mid + 1, r, 2 * node + 1);
  tree[node] = min(tree[2 * node], tree[2 * node + 1]);
}
void findans() {
  for (int i = 0; i <= n; ++i)
    sortr[i] = pair<long long, long long>(valr[i + 1], i + 1);
  sort(sortr, sortr + n + 1);
  for (int i = 0; i <= n; ++i) ind[sortr[i].second] = i;
  init();
  long long best = 1e9 + 5;
  for (int i = n; i >= 0; --i) {
    if (validr[i + 1]) upd(ind[i + 1], pos[i + 1]);
    if (!validl[i]) continue;
    int lo = -1, hi = n;
    while (lo != hi) {
      int mid = (lo + hi + 1) / 2;
      if (sortr[mid].first > vall[i])
        hi = mid - 1;
      else
        lo = mid;
    }
    if (lo != -1) best = min(best, findmin(0, lo) - pos[i]);
  }
  cout << fixed << setprecision(1) << 0.5 * best << endl;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n + 2; ++i) cin >> pos[i];
  d[0] = d[n + 1] = 1LL * 1000000 * 1000000 + 5;
  for (int i = 1; i <= n; ++i) cin >> d[i];
  computeleft();
  computeright();
  findans();
}
