#include using namespace std; long binaryleft(int val, vector& x, int low, int high) { while (low < high) { long mid = (low + (high-low))/2; if (x[mid] < val) { low = mid + 1; } else high = mid; } return high; } long binaryright(int val, vector& x, int low, int high) { while (low < high) { long mid = (low + (high-low))/2; if (x[mid] <= val) { low = mid; } else high = mid - 1; } return low; } long maximumPeople(vector p, vector x, vector y, vector r) { // Return the maximum number of people that will be in a sunny town after removing exactly one cloud. // x is sorted? // for each could range do binary search on the original to see how many ppl are covered // for left find first item >= left range // for right first first item <= right range long bestCloud = -1; long maxPop = 0; if (y.size() == 1 || y.size() == 0) { for (auto i = 0; i < p.size(); i++) maxPop += p[i]; return maxPop; } for (auto i = 0; i < y.size(); i++) { long ltownInd = binaryleft(y[i]-r[i], x, 0, x.size()-1); long rtownInd = binaryright(y[i]+r[i], x, 0, x.size()-1); long pop = 0; for (auto j = ltownInd; j <= rtownInd; j++) { pop += p[j]; } if (pop > maxPop) { maxPop = pop; bestCloud = i; } } return maxPop; } int main() { int n; cin >> n; vector p(n); for(int p_i = 0; p_i < n; p_i++){ cin >> p[p_i]; } vector x(n); for(int x_i = 0; x_i < n; x_i++){ cin >> x[x_i]; } int m; cin >> m; vector y(m); for(int y_i = 0; y_i < m; y_i++){ cin >> y[y_i]; } vector r(m); for(int r_i = 0; r_i < m; r_i++){ cin >> r[r_i]; } long result = maximumPeople(p, x, y, r); cout << result << endl; return 0; }