#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 2e5+10;
struct Date{
	int v,id;
}a[N];

struct Node{
	int l,r;
	int sum,lmax,rmax;
}node[N<<2];

int ans[N];


void pushup(int i){
	node[i].sum = node[i<<1].sum+node[i<<1|1].sum;
	node[i].lmax = max(node[i<<1].lmax,node[i<<1].sum+node[i<<1|1].lmax);
	node[i].rmax = max(node[i<<1|1].rmax,node[i<<1|1].sum+node[i<<1].rmax);	
}

void build(int u,int l,int r){
	node[u].l = l;
	node[u].r = r;
	if(l==r){
		node[u].lmax = node[u].rmax = node[u].sum = -1;
	}
	else{
		int mid = (l+r)>>1;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
}

Node query(int u,int l,int r){
	if(node[u].l==l&&node[u].r==r) return node[u];
	int mid = (node[u].l+node[u].r)>>1;
	if(r<=mid) return query(u<<1,l,r);
	else if(l>mid) return query(u<<1|1,l,r);
	else{
		Node a,b,c;
		a = query(u<<1,l,mid);
		b = query(u<<1|1,mid+1,r);
		c.sum = a.sum+b.sum;
		c.lmax = max(a.lmax,a.sum+b.lmax);
		c.rmax = max(b.rmax,b.sum+a.rmax);
		return c;
	}
}

//Node query(int i,int l,int r)
//{
//	if(node[i].l==l&&node[i].r==r)
//		return node[i];
//	int mid=(node[i].l+node[i].r)>>1;
//	if(r<=mid)
//		return query(i<<1,l,r);
//	else if(l>mid)
//		return query(i<<1|1,l,r);
//	else
//	{
//		Node a,b,c;
//		a=query(i<<1,l,mid);
//		b=query(i<<1|1,mid+1,r);
//		c.sum=a.sum+b.sum;
//		c.lmax=max(a.lmax,a.sum+b.lmax);
//		c.rmax=max(b.rmax,b.sum+a.rmax);
//		return c;
//	}
//}


void modify(int u,int x,int v){
	if(node[u].l==node[u].r){
		node[u].lmax = node[u].rmax = node[u].sum = v;
		return;
	}	
	int mid = (node[u].l+node[u].r)>>1;
	if(x<=mid) modify(u<<1,x,v);
	else modify(u<<1|1,x,v);
	pushup(u);
}
//void modify(int i,int x,int v)
//{
//	if(node[i].l==node[i].r)
//	{
//		node[i].lmax=node[i].rmax=node[i].sum=v;
//		return;
//	}
//	int mid=(node[i].l+node[i].r)>>1;
//	if(x<=mid)
//		modify(i<<1,x,v);
//	else
//		modify(i<<1|1,x,v);
//	pushup(i);
//}


bool cmp(Date a,Date b){
	return a.v<b.v;	
}

int main()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++) {
		scanf("%d",&a[i].v);
		a[i].id = i;
	}
	
	for(int i=0;i<2;i++){
		sort(a+1,a+1+n,cmp);
		build(1,1,n);
		int p=1,q=1;
		for(int j=1;j<=n;j++){
			while(p<=n&&a[p].v==j){
				modify(1,a[p].id,1);
				p++;
			}
			while(q<=n&&a[q].v==j){
				Node ln = query(1,1,a[q].id);
				Node rn = query(1,a[q].id,n);
				ans[a[q].id] = max(ans[a[q].id],ln.rmax+rn.lmax-1-!i);
				q++;
			}
		}
		for(int j=1;j<=n;j++) a[j].v = n-a[j].v+1;
	}
	for(int i=1;i<=n;i++) printf("%d%c",ans[i]/2," \n"[i==n]);
	return 0;	
} 