/*
Hack 1:
8
1 1 2 1 4 7 1 1
1 2 3 4 5 6 7 8
*/
#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>
#define int long long
#define N ((int)2e5 + 10)
using namespace std;
vector < pair <int, int> > segs[N];
int w[N], c[N];
signed main() {
int n;
scanf("%lld", &n);
int last_color = -1, left = 1;
for (int i = 1; i <= n; i++) {
scanf("%lld", c + i);
if (i == 1) last_color = c[i];
if (c[i] != last_color) {
segs[last_color].push_back({left, i - 1});
last_color = c[i];
left = i;
}
}
segs[c[n]].push_back({left, n});
// puts("Segments: ");
// for (int i = 1; i <= n; i++) {
// printf("Color = %lld: \n", i);
// for (const auto& [l, r] : segs[i])
// printf("\t%lld %lld\n", l, r);
// }
for (int i = 1; i <= n; i++) scanf("%lld", w + i);
for (int i = 1; i <= n; i++) {
int cnt = segs[i].size() + 1, sum = 0, l2 = 1, r2 = n;
for (const auto& [l, r] : segs[i]) sum += r - l + 1;
// printf("\nFor color %lld we have %lld segments, %lld pixels to color!!!!\n", i, cnt, n - sum);
if (segs[i].size() && segs[i].front().first == 1) {
cnt--;
l2 = segs[i].front().second + 1;
}
if (segs[i].size() && segs[i].back().second == n) {
cnt--;
r2 = segs[i].back().first - 1;
}
printf("%lld ", min(cnt * w[i] + (n - sum), w[i] + r2 - l2 + 1));
}
return 0;
}