#include using namespace std; template > vector > monotone_minima(int H, int W, const function& f, const Compare& comp = Compare()) { vector > dp(H); function dfs = [&](int top, int bottom, int left, int right) { if (top > bottom) return; int line = (top + bottom) / 2; T ma; int mi = -1; for (int i = left; i <= right; i++) { T cst = f(line, i); if (mi == -1 || comp(cst, ma)) { ma = cst; mi = i; } } dp[line] = make_pair(mi, ma); dfs(top, line - 1, left, mi); dfs(line + 1, bottom, mi, right); }; dfs(0, H - 1, 0, W - 1); return dp; } template > vector online_offline_dp(int W, const function& f, const Compare& comp = Compare()) { vector dp(W + 1); vector isset(W + 1); int y_base = -1, x_base = -1; function get_cost = [&](int y, int x) { // return dp[0, x+x_base)+f[x+x_base, y+y_base) return dp[x + x_base] + f(x + x_base, y + y_base); }; function induce = [&](int l, int m, int r) { // dp[l, m) -> dp[m, r) x_base = l, y_base = m; auto ret = monotone_minima(r - m, m - l, get_cost, comp); for (int i = 0; i < ret.size(); i++) { if (!isset[m + i] || comp(ret[i].second, dp[m + i])) { isset[m + i] = true; dp[m + i] = ret[i].second; } } }; function dfs = [&](int l, int r) { if (l + 1 == r) { x_base = l, y_base = l; T cst = l ? get_cost(0, -1) : 0; if (!isset[l] || comp(cst, dp[l])) { isset[l] = true; dp[l] = cst; } } else { int mid = (l + r) / 2; dfs(l, mid); induce(l, mid, r); dfs(mid, r); } }; dfs(0, W + 1); return dp; }; int main(void) { cin.tie(0); ios::sync_with_stdio(false); int n; cin >> n; vector< int > a(n), x(n), y(n); for(int i = 0; i < n; i++) cin >> a[i]; for(int i = 0; i < n; i++) cin >> x[i]; for(int i = 0; i < n; i++) cin >> y[i]; function< int64_t(int, int) > dist = [&](int i, int j) { assert(0 <= i && i < j && j <= n); int s = abs(a[j - 1] - x[i]); int t = abs(y[i]); return 1LL * s * s * s + 1LL * t * t * t; }; cout << online_offline_dp(n, dist).back() << '\n'; return 0; }