#include <bits/stdc++.h>
using namespace std;
#define mid (l+r)/2
#define mid2 (start+end)/2
#define inf 1000000000
#define li 37000
#define mp make_pair
#define fi first
#define se second
#define lo long long
int n,A[li],dp[li],say,vis[li],lookup[li][30],lookup2[li][30];
pair<int,int> tree[li*4];
void buildminSparseTable(int n)
{
for (int i = 1; i <= n; i++)
lookup[i][0] = A[i];
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 1; (i + (1 << j) - 1) <= n; i++)
{
if (lookup[i][j - 1] < lookup[i + (1 << (j - 1))][j - 1])
lookup[i][j] = lookup[i][j - 1];
else
lookup[i][j] = lookup[i + (1 << (j - 1))][j - 1];
}
}
}
int querymin(int L, int R)
{
int j = (int)log2(R - L + 1);
if (lookup[L][j] <= lookup[R - (1 << j) + 1][j])
return lookup[L][j];
else
return lookup[R - (1 << j) + 1][j];
}
void buildmaxSparseTable(int n)
{
for (int i = 1; i <= n; i++)
lookup2[i][0] = A[i];
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 1; (i + (1 << j) - 1) <= n; i++)
{
if (lookup2[i][j - 1] > lookup2[i + (1 << (j - 1))][j - 1])
lookup2[i][j] = lookup2[i][j - 1];
else
lookup2[i][j] = lookup2[i + (1 << (j - 1))][j - 1];
}
}
}
int querymax(int L, int R)
{
int j = (int)log2(R - L + 1);
if (lookup2[L][j] >= lookup2[R - (1 << j) + 1][j])
return lookup2[L][j];
else
return lookup2[R - (1 << j) + 1][j];
}
int naive(int val){
say++;
int cev=0;
for(int i=val;i<=n;i++){
int basla=i-val+1;
cev=max(cev,querymax(basla,i)-querymin(basla,i));
}
return cev;
}
void solve(int l,int r,int optl,int optr){
if(l>r) return ;
if(optl==optr || vis[mid]==1){
if(vis[mid]==0)
dp[mid]=optl;
vis[mid]=1;
}
else {dp[mid]=naive(mid);vis[mid]=1;}
solve(l,mid-1,optl,dp[mid]),solve(mid+1,r,dp[mid],optr);
}
void general(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&A[i]);
buildmaxSparseTable(n);
buildminSparseTable(n);
solve(1,n,0,inf);
for(int i=1;i<=n;i++) printf("%d ",dp[i]);
printf("\n");
}
int main(){
general();
return 0;
}