#include <iostream>
#include <set>

using namespace std;
int const N = 2e5 + 2;
int const M = (1<<20) + 2;
int const INF = 1e9+2;
int tsu[M];
int tlmi[M];
int tlma[M];
int trmi[M];
int trma[M];
int n;
int max_left[N];
int max_right[N];
int a[N];
set <pair <int,int>> mezcz;

void build(int v, int tl, int tr)
{
    if(tl == tr) 
    {
	tsu[v] = -1;
	tlmi[v] = trmi[v] = -1;
	tlma[v] = trma[v] = 0;
    }
    else 
    {
	int mid = (tl + tr)>>1;
        build(v<<1, tl, mid);
        build((v<<1)+1, mid+1, tr);
	tsu[v] = tsu[v*2] + tsu[v*2+1];
	tlmi[v] = trmi[v] = tsu[v];
	tlma[v] = trma[v] = 0;
    }
}

pair <int, int> query(int v, int l, int r, int tl, int tr, bool dir, bool maks)
{
    if(r<l) return {INF, 0};
    if(l == tl && r == tr) 
    {
	pair <int, int> ala;
	ala.first = tsu[v];
	if(dir && maks) ala.second = trma[v];
	else if(dir && (!maks)) ala.second = trmi[v];
	else if((!dir) && maks) ala.second = tlma[v];
	else if((!dir) && (!maks)) ala.second = tlmi[v];
	return ala;
    }
    else
    {
        int mid = (tl + tr)/2;
        pair <int, int> qw1 = query(2*v, l, min(mid, r), tl, mid, dir, maks);
        pair <int, int> qw2 = query(2*v+1, max(mid+1, l), r, mid+1, tr, dir, maks);
	if(qw1.first == INF) return qw2;
	if(qw2.first == INF) return qw1;
	int g = 0;
	if(dir && maks) g = max(qw1.second, qw2.second+qw1.first);
	else if(dir && (!maks)) g = min(qw1.second, qw2.second+qw1.first);
	else if((!dir) && maks) g = max(qw2.second, qw2.first+qw1.second);
	else if((!dir) && (!maks)) g = min(qw2.second, qw2.first+qw1.second);
	return {qw1.first+qw2.first, g};
    }
}

void update(int v, int pos, int tl, int tr, int val)
{
    if(tl == tr)
    {
        tsu[v] = val;
	tlmi[v] = trmi[v] = min(0, val);
	tlma[v] = trma[v] = max(0, val);
    }
    else
    {
        int mid = (tl+tr)>>1;
	if(pos <= mid) update(v<<1, pos, tl, mid, val);
        else update((v<<1)+1, pos, mid+1, tr, val);
        tsu[v] = tsu[v<<1] + tsu[(v<<1)+1];
	tlmi[v] = min(tlmi[v*2+1], tsu[v*2+1]+tlmi[v*2]);
        trmi[v] = min(trmi[v*2], trmi[v*2+1] + tsu[v*2]);
	tlma[v] = max(tlma[v*2+1], tsu[v*2+1]+tlma[v*2]);
        trma[v] = max(trma[v*2], trma[v*2+1] + tsu[v*2]);
    }
}


int main()
{
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
	scanf("%d", &a[i]);
        mezcz.insert({a[i], i});
    }
    build(1, 1, n);
    auto itr = mezcz.begin();
    while(itr != mezcz.end())
    {
	int cons = (*itr).first;
	auto cop = itr;
        while(cop->first == cons && cop != mezcz.end())
	{
	     int we = query(1, 1, cop->second-1, 1, n, false, false).second;
	     int fer = query(1, cop->second+1, n, 1, n, true, false).second;
	     max_left[cop->second] = (-we-fer+1)/2;
	     cop++;
	}
        cop = itr;
        while(cop->first == cons && cop != mezcz.end())
	{
	     update(1, cop->second, 1, n, 1);
	     cop++;
	}
	cop = itr;
        while(cop->first == cons && cop != mezcz.end())
	{
	     int we = query(1, 1, cop->second-1, 1, n, false, true).second;
	     int fer = query(1, cop->second+1, n, 1, n, true, true).second;
	     max_right[cop->second] = (we+fer)/2;
	     cop++;
	}
	itr = cop;
    }
    for(int i=1; i<=n; i++)
    {
	printf("%d ", max(max_left[i], max_right[i]));
    }
    return 0;
}