#include using namespace std; using ll = long long; using ull = unsigned long long; const int MAXN = 2 * 100000 + 10; ll n, m; ll x[MAXN]; ll y[MAXN]; ll p[MAXN]; ll r[MAXN]; ll sump[MAXN]; struct Aug { ll pos; int id; int dir; Aug(ll p, int d, int dd) : pos(p), id(d), dir(dd){}; friend bool operator<(const Aug& s1, const Aug& s2) { return s1.pos < s2.pos; } }; int main() { ios::sync_with_stdio(false); cin >> n; vector> cts; for (int i = 0; i < n; ++i) { cin >> p[i]; } for (int i = 0; i < n; ++i) { cin >> x[i]; } for (int i = 0; i < n; ++i) { cts.emplace_back(x[i], p[i]); } sort(cts.begin(), cts.end()); cin >> m; for (int i = 0; i < m; ++i) { cin >> y[i]; } for (int i = 0; i < m; ++i) { cin >> r[i]; } // create seg vector augs; for (int i = 0; i < m; ++i) { augs.emplace_back(y[i] - r[i], i, 1); augs.emplace_back(y[i] + r[i] + 1, i, -1); } sort(augs.begin(), augs.end()); unordered_set onstk; int yi = 0; ll sun = 0; ll cover = 0; for (int i = 0; i < n; ++i) { const ll cpos = cts[i].first; const ll popl = cts[i].second; while (yi < augs.size() && augs[yi].pos <= cpos) { auto c = augs[yi]; const int id = c.id; const int dir = c.dir; if (dir == 1) { onstk.insert(id); } else onstk.erase(id); yi++; } if (onstk.size() == 1) { const int cid = *onstk.begin(); sump[cid] += popl; cover = max(cover, sump[cid]); } else if (onstk.size() == 0) { sun += popl; } } cout << sun + cover << endl; return 0; }