/*
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;
}