#include<bits/stdc++.h>
using namespace std;
vector<int> vec[200001];
int ans[200001],arr[200001];
struct data
{
	int l,r,mini,maxi,d;
};
data tree[1000001];
void pushup(int x)
{
    tree[x].maxi=max(tree[x<<1].maxi,tree[(x<<1)+1].maxi);
    tree[x].mini=min(tree[x<<1].mini,tree[(x<<1)+1].mini);
    return;
}
void pushdown(int x)
{
	int mid=(tree[x].l+tree[x].r)>>1;
	int d=tree[x].d;
	tree[x<<1].d+=d;
	tree[(x<<1)+1].d+=d;
	tree[x<<1].maxi+=d;
	tree[(x<<1)+1].maxi+=d;
	tree[x<<1].mini+=d;
	tree[(x<<1)+1].mini+=d;
	tree[x].d=0;
	pushup(x);
	return; 
}
void revise(int i,int l,int r,int d)
{
	
	if(l<=tree[i].l&&r>=tree[i].r)
	{
		tree[i].d+=d;
		tree[i].maxi+=d;
		tree[i].mini+=d;
		return ;
	}
	int mid=(tree[i].l+tree[i].r)>>1;
	if(tree[i].d!=0)
	{
		pushdown(i);
	}
	if(mid>=l)
	{
		revise(i<<1,l,r,d);
	}
	if(mid<r)
	{
		revise((i<<1)+1,l,r,d);
	}
	pushup(i);
	
}
int query_max(int i,int l,int r)
{
	if(r==0)
	{
		return 0;
	}
	int mid=(tree[i].l+tree[i].r)>>1;
	
	if(l<=tree[i].l&&r>=tree[i].r)
	{
		return tree[i].maxi;
	}
	if(tree[i].d!=0)
	{
		pushdown(i);
	}
	pushup(i);
	int ans=-1e9;
	if(mid>=l)
	{
		ans=max(ans,query_max((i<<1),l,r));
	}
	if(mid<r)
	{
		ans=max(ans,query_max(((i<<1)+1),l,r));
	}
	pushup(i);
	return ans;
}
int query_min(int i,int l,int r)
{
	if(r==0)
	{
		return 0;
	}
	int mid=(tree[i].l+tree[i].r)>>1;
	
	if(l<=tree[i].l&&r>=tree[i].r)
	{
		return tree[i].mini;
	}
	if(tree[i].d!=0)
	{
		pushdown(i);
	}
	pushup(i);
	int ans=1e9;
	if(mid>=l)
	{
		ans=min(ans,query_min((i<<1),l,r));
	}
	if(mid<r)
	{
		ans=min(ans,query_min(((i<<1)+1),l,r));
	}
	pushup(i);
	return ans;
}
void init(int i,int l,int r)
{
	tree[i].l=l;
	tree[i].r=r;
	tree[i].maxi=0;
	tree[i].d=0;
	tree[i].mini=0;
	if(l==r)
	{
		return;
	}
	int mid=(l+r)>>1;
	init((i<<1),l,mid);
	init((i<<1)+1,mid+1,r);
	return;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1 ; i<=n ; i++)
	{
		cin>>arr[i];
		vec[arr[i]].push_back(i);
	}
	init(1,1,n);
	for(int i=1;  i<=n ; i++)
	{
		revise(1,i,n,-1);
	}
	for(int i=1 ; i<=n ; i++)
	{
		ans[i]=0;
	}
	for(int i=1;  i<=n ; i++)
	{
		for(int j=0 ; j<vec[i].size() ; j++)
		{
			revise(1,vec[i][j],n,2);
			int k=vec[i][j];
			int a=query_max(1,1,k-1);
			int b=query_min(1,k,n);
			a=max(a,0);
			int c=b-a;
			int tmp=(floor)((double)(c-1)/(double)2);
			//cout<<vec[i][j]<<" "<<a<<" "<<b<<"\n";
			ans[k]=max(ans[k],abs(tmp));
			revise(1,vec[i][j],n,-2);
		}
		
		for(int j=0 ; j<vec[i].size() ; j++)
		{
			int k=vec[i][j];
			revise(1,k,n,2);
		}
		for(int j=0 ; j<vec[i].size() ; j++)
		{
			int k=vec[i][j];
			int a=query_min(1,1,k-1);
			int b=query_max(1,k,n);
			a=min(0,a);
			int c=b-a;
			//cout<<c<<"\n";
			int tmp=(floor)((double)(c-1)/(double)2);
			//cout<<vec[i][j]<<" "<<tmp<<" "<<b<<"\n";
			ans[k]=max(ans[k],abs(tmp));
		}
	}
	for(int i=1;  i<=n ; i++)
	{
		cout<<ans[i]<<" ";
	}
	cout<<"\n";
}