#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 ;   }