#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n = 1, m;
cin >> m;
vector<int> b(m+1), a(m+1,0), k(m+1,0);
for (int i=1; i<=m; i++) cin >> b[i];
long long tot_k = 0, kc = 0;
for (int i = 1; i <= m; i++) {
if (b[i] == 1) {
a[i] = 1;
}
else if (b[i] == 2) {
k[i] = 1;
tot_k += i;
kc++;
}
else if (b[i] == 3) {
a[i] = 1;
k[i] = 1;
tot_k += i;
kc++;
}
}
// ---- Aarsi optimized using prefix sums ----
vector<long long> prefixA(m+2,0), countA(m+2,0);
for (int i=1; i<=m; i++) {
prefixA[i] = prefixA[i-1] + (a[i] ? i : 0);
countA[i] = countA[i-1] + (a[i] ? 1 : 0);
}
long long total_sumA = prefixA[m], total_countA = countA[m];
vector<long long> aarsi(m+1,0);
for (int line=1; line<=m; line++) {
long long left_count = countA[line-1];
long long left_sum = prefixA[line-1];
long long left_cost = left_count * 1LL * line - left_sum;
long long right_count = total_countA - countA[line];
long long right_sum = total_sumA - prefixA[line];
long long right_cost = right_sum - right_count * 1LL * line;
aarsi[line] = left_cost + right_cost;
}
// ---- Krypto costs ----
vector<long long> krypto(m+1,0);
long long sum_of_krypto = 0, count_of_krypto = 0;
for (int line=1; line<=m; line++) {
long long w = 0, d = 0;
if (k[line] == 1) {
sum_of_krypto += line;
w = line;
d = 1;
count_of_krypto++;
}
long long left = count_of_krypto * 1LL * line - sum_of_krypto;
long long right = (tot_k - sum_of_krypto + w) - 1LL * line * (kc - count_of_krypto + d);
krypto[line] = left + right;
}
// ---- Print results ----
for (int i=1; i<=m; i++) {
cout << llabs(aarsi[i] - krypto[i]) << " ";
}
cout << "\n";
return 0;
}