import bisect def main(): import sys input = sys.stdin.read().split() idx = 0 n = int(input[idx]) idx +=1 a = list(map(int, input[idx:idx+n])) idx +=n x = list(map(int, input[idx:idx+n])) idx +=n y = list(map(int, input[idx:idx+n])) idx +=n INF = 1 << 60 class SegmentTree: def __init__(self, size): self.n = 1 while self.n < size: self.n <<=1 self.size = size self.tree = [INF] * (2 * self.n) def update(self, pos, val): pos += self.n self.tree[pos] = val while pos >1: pos >>=1 new_val = min(self.tree[2*pos], self.tree[2*pos+1]) if self.tree[pos] == new_val: break self.tree[pos] = new_val def query(self, l, r): res = INF l += self.n r += self.n while l < r: if l %2 ==1: res = min(res, self.tree[l]) l +=1 if r %2 ==1: r -=1 res = min(res, self.tree[r]) l >>=1 r >>=1 return res L_segtree = SegmentTree(n) R_segtree = SegmentTree(n) dp = [0]*n for i in range(n): if i ==0: prev_dp = 0 else: prev_dp = dp[i-1] xi = x[i] yi = y[i] ai = a[i] L_val = prev_dp - xi + yi R_val = prev_dp + xi + yi L_segtree.update(i, L_val) R_segtree.update(i, R_val) m_candidate = bisect.bisect_right(x, ai) -1 m = min(m_candidate, i) min_left = INF if m >=0: min_left = L_segtree.query(0, m+1) min_right = INF if m+1 <=i: min_right = R_segtree.query(m+1, i+1) candidates = [] if min_left != INF: candidates.append(min_left + ai) if min_right != INF: candidates.append(min_right - ai) dp[i] = min(candidates) print(dp[-1]) if __name__ == '__main__': main()