显示原始代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, day, cnt[N], num[N];
long x[N], a[N], b[N];
bool cmp(int u, int y) {
if (a[u] == a[y])
return u < y;
else
return a[u] < a[y];
}
int counttotal(int s) {
if (s == 1)
return 1;
else if (s == 2)
return 2;
else if (s % 2 == 0)
return (s * s + 2 * s) / 4;
else
return counttotal(s - 1) + (s + 1) / 2;
}
int findday(int l, int r, int t) {
while (l <= r) {
int mid = (l + r) / 2;
if (counttotal(mid) < cnt[t])
l = mid + 1;
else
r = mid - 1;
}
return l;
}
int main() {
cin >> n;
long max = 0;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= n; i++) num[i] = i;
sort(num + 1, num + n + 1, cmp);
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> x[i];
}
day = 0, cnt[1] = 0;
long temp = x[1];
for (long j = 1; j <= n; j++) {
if (temp > a[num[j]])
temp += b[num[j]];
else {
cnt[1] += a[num[j]] - temp + 1;
temp = a[num[j]] + b[num[j]] + 1;
}
}
if (cnt[1] == 0)
day = 0;
else
day = findday(1, cnt[1], 1);
cout << day << ' ';
for (int i = 2; i <= m; i++) {
if (cnt[1] + x[1] - x[i] > 0)
cnt[i] = cnt[1] + x[1] - x[i];
else
cnt[i] = 0;
if (cnt[i] == 0)
day = 0;
else
day = findday(1, cnt[i], i);
cout << day << ' ';
}
return 0;
}