/*** 2 10 100 5 100 1 4 1 ***/ #include using namespace std; typedef long long ll; typedef long double ld; int main() { ll n; cin >> n; pairc[n]; for (ll i = 0; i < n; i++) cin >> c[i].first; for (ll i = 0; i < n; i++) cin >> c[i].second; sort(c, c + n, [](paira, pairb) {return a.second < b.second;}); ll m; cin >> m; ll y[m]; ll r[m]; for (ll i = 0; i < m; i++) cin >> y[i]; for (ll i = 0; i < m; i++) cin >> r[i]; multiset>X; for (ll i = 0; i < m; i++) X.insert(make_pair(y[i] - r[i], 1)); for (ll i = 0; i < m; i++) X.insert(make_pair(y[i] + r[i] + 1, -1)); ll kiek = 0; ll s[n]; ll suma = 0; ll ans = 0; for (ll i = 0; i < n; i++) { while (!X.empty() && (*X.begin()).first <= c[i].second) { auto it = X.begin(); kiek += it->second; X.erase(it); } if (i != 0) s[i] = s[i - 1]; else s[i] = 0; if (kiek == 1) s[i] += c[i].first; if (kiek == 0) suma += c[i].first; } seta; mapb; for (ll i = 0; i < n; i++) { a.insert(c[i].second); b[c[i].second] = i; } ans = suma; for (ll i = 0; i < m; i++) { ll l_ = y[i] - r[i]; ll r_ = y[i] + r[i]; auto it_l = a.lower_bound(l_); auto it_r = a.upper_bound(r_); if (it_l != a.begin() && it_r != a.begin()) { it_l--; it_r--; ans = max(ans, suma + s[b[*it_r]] - s[b[*it_l]]); } else if (it_l == a.begin() && it_r != a.begin()) { it_r--; ans = max(ans, suma + s[b[*it_r]]); } } cout << ans << endl; }