#pragma GCC optimize("O2")
#include <bits/stdc++.h>
using namespace std;
#define int long long
int random(int l, int h) {
static mt19937 gen;
return uniform_int_distribution<int>(l, h)(gen);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
#ifdef CB
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
int N = 20;
cin >> N;
if (N > 1000) {
return 0;
}
vector<int> v(N);
for(int j=0;j<5;j++){
for (int i = 0; i < N; i++) {
v[i] = random(1, N*5);
}
sort(v.begin(), v.end());
}
for (int i = 0; i < N; i++) {
cin >> v[i];
}
vector<int> ans(N);
ans[0] = N - 1;
ans[N - 1] = 0;
for (int i = 1; i < N - 1; i++) {
list<int> l(v.begin(), v.end());
auto t = next(l.begin(), i);
while (true) {
if (*t - *prev(t) <= *next(t) - *t) {
t = prev(l.erase(t));
}
else {
t = l.erase(t);
}
if (t == l.begin()) {
ans[i] = N - 1;
break;
}
if (t == prev(l.end())) {
ans[i] = 0;
break;
}
}
}
vector<int> a(N);
vector<int> b(N);
vector<int> c(N);
for (int i = 1; i <= N - 2; i++) {
a[i] = lower_bound(v.begin(), v.end(), v[i] * 2 - v[i - 1]) - v.begin() - 1;
b[i] = lower_bound(v.begin(), v.end(), v[i] * 2 - v[i + 1]) - v.begin();
}
// vector<vector<int>> rb(N);
// for (int i = 0; i <= N - 1; i++) {
// rb[b[i]].push_back(i);
// }
// auto update_greater = [&](int l, int r, int x, int y) {
// while (r >= l) {
// if (c[r] > x) {
// c[r] = y;
// }
// r--;
// }
// };
// auto update_less = [&](int l, int r, int x, int y) {
// while (r >= l) {
// if (c[r] < x) {
// c[r] = y;
// }
// r--;
// }
// };
// for (int i = N - 1; i >= 0; i--) {
// for (int j : rb[i]) {
// update_greater(0, j, j, j);
// }
// update_less(0, N - 1, a[i], N);
// }
// for (int i = 1; i <= N - 2; i++) {
// int j = min_element(b.begin() + i, b.end() - 1) - b.begin();
// int ok = 0;
// for (int k = 1; k <= b[j]; k++) {
// ok |= a[k] >= j;
// }
// int x = ok ? 0 :N-1;
// if(ans[i]!=x){
// cout << i<<" "<<!ans[i] << " "<<ok<<endl;
// exit(2);
// }
// }
vector<int> s;
for (int i = N - 2; i >= 1; i--) {
while (!s.empty() && b[s.back()] >= b[i]) {
s.pop_back();
}
s.push_back(i);
int x = *max_element(a.begin(), a.begin() + b[s.front()] + 1);
if (x > s.front()) {
c[i] = N - 1;
continue;
}
if(0&&i==632){
cout<<x<<endl;
cout<<s.size()<<endl;
for(int j:s)cout<<j<<" ";cout<<endl;
for(int j:s)cout<<b[j]<<" ";cout<<endl;
cout<<endl;
int h = i;
for (int j = i; j > 0; j--) {
if (a[j] > h) {
cout << "at " << j << " " << a[j]<<endl;
cout<<"from " << h << " ";
while (h < N && b[h] >= j) {
h++;
}
cout<<"to " << h << " blocker " << b[h]<< endl;
}
}
}
for (int j = 1; j < s.size(); j++) {
int y = *max_element(a.begin() + b[s.front()] + 1, a.begin() + b[s[j]] + 1);
if (j + 1 < s.size() && *max_element(a.begin() + b[s[j]] + 1, a.begin() + b[s[j + 1]] + 1) <= s[j + 1] && y > s[j + 1]) {
continue;
}
if (y <= s[j] && x > s[j]) {
c[i] = N - 1;
break;
}
}
}
for (int i = 1; i <= N - 2; i++) {
int x = c[i] == N - 1 ? 0 : N - 1;
if(ans[i]!=x){
cout<<i<<" "<<!ans[i]<<" "<<!!c[i]<<endl;
exit(!!c[i]);
}
ans[i] = x;
}
// main();
for (int i = 0; i < N; i++) {
cout << ans[i] << ' ';
}
cout << '\n';
return 0;
}