#include #include #include #include #include #include #include using namespace std; typedef pair pii; int main() { int n; cin >> n; vector> towns(n); for (int i = 0; i < n; i++) cin >> towns[i].second; for (int i = 0; i < n; i++) cin >> towns[i].first; sort(towns.begin(), towns.end()); int m; cin >> m; vector> clouds(m); for (int i = 0; i < m; i++) cin >> clouds[i].first; for (int i = 0; i < m; i++) cin >> clouds[i].second; vector>> cloudEdges(n); for (int i = 0; i < m; i++) { int startIdx = 0; int endIdx = 0; { auto it = lower_bound(towns.begin(), towns.end(), make_pair(clouds[i].first - clouds[i].second, 0), [](pii const & l, pii const & r)->bool { return l.first < r.first; }); startIdx = (int)std::distance(towns.begin(), it); } { auto it = upper_bound(towns.begin(), towns.end(), make_pair(clouds[i].first + clouds[i].second, 0), [](pii const & l, pii const & r)->bool { return l.first < r.first; }); endIdx = (int)std::distance(towns.begin(), it) - 1; } if (startIdx <= endIdx) { if (startIdx >= n) startIdx = n-1; if (endIdx < 0) endIdx = 0; cloudEdges[startIdx].push_back(make_pair(i, true)); cloudEdges[endIdx].push_back(make_pair(i, false)); } } long long ans = 0; vector pans(m); set curClouds; for (int i = 0; i < n; i++) { for (int j = 0; j < cloudEdges[i].size(); j++) if (cloudEdges[i][j].second) curClouds.insert(cloudEdges[i][j].first); if (0 == curClouds.size()) ans += towns[i].second; else if (1 == curClouds.size()) pans[*curClouds.begin()] += towns[i].second; for (int j = 0; j < cloudEdges[i].size(); j++) if (false == cloudEdges[i][j].second) curClouds.erase(cloudEdges[i][j].first); } ans += *max_element(pans.begin(), pans.end()); cout << ans << endl; return 0; }