//前缀和,差分,二分
意:n个人n种茶,每种茶有ai,每人每次能喝min(ai,bi);ith个人从ith茶往前喝直到没有茶或茶被喝完;求每人最终喝的总量
思路:第i种茶分给从i开始往后的人,直到没得分:求bi的前缀和,二分找到一个区间和<=ai;
从[l,r-1]中的人一定是可以喝b[i]的:差分标记
处理ai多出来的部分:加到下一个人上
//注意区间里恰好只有一个人的情况:即l==i
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10;
int n, m;
int a[N], b[N], cnt[N], s[N], ans[N];
void add(int l, int r)
{
cnt[l]++;
cnt[r + 1]--;
}
bool check(int x, int m)
{
if (x <= m)return true;
return false;
}
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = 1; i <= n; i++)
{
cin >> b[i], s[i] = s[i - 1] + b[i];
ans[i] = 0; cnt[i] = 0;
}
for (int i = 1; i <= n; i++)
{
int l = i, r = n;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(s[mid] - s[i - 1], a[i]))l = mid;
else r = mid - 1;
}
if (i == l)
{
int g = min(a[i], b[i]);
ans[i] += g;
if (a[i] > g)
{
g = a[i] - g;
ans[l + 1] += min(g, b[l + 1]);
}
continue;
}
add(i, l);
if (s[l] - s[i - 1] < a[i])
{
int g = a[i] - (s[l] - s[i - 1]);
ans[l + 1] += min(g, b[l + 1]);
}
}
for (int i = 1; i <= n; i++)cnt[i] += cnt[i - 1];
for (int i = 1; i <= n; i++)
{
ans[i] += cnt[i] * b[i];
cout << ans[i] << " ";
}cout << endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _ = 1;
cin >> _;
while (_--)solve();
}