#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 100010;
int MAX[maxn<<2];
int MIN[maxn<<2];
long long ans[maxn];
long long N[maxn];
int Pos=0,n;
long long read()
{
long long ans=0;
char last=‘ ‘,ch=getchar();
while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar();
while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar();
if(last==‘-‘)ans=-ans;
return ans;
}
void PushUP_max(int rt)
{
if (N[MAX[rt<<1]] > N[MAX[rt<<1|1]])
MAX[rt] = MAX[rt<<1] ;
else
MAX[rt] =MAX[rt<<1|1];
}
void PushUP_min(int rt)
{
if (N[MIN[rt<<1]] < N[MIN[rt<<1|1]])
MIN[rt] = MIN[rt<<1] ;
else
MIN[rt] =MIN[rt<<1|1];
}
void build_max(int l,int r,int rt)
{
if (l == r)
{
MAX[rt]=++Pos;
return ;
}
int m = (l + r) >> 1;
build_max(lson);
build_max(rson);
PushUP_max(rt);
}
void build_min(int l,int r,int rt)
{
if (l == r)
{
MIN[rt]=MAX[rt];
return ;
}
int m = (l + r) >> 1;
build_min(lson);
build_min(rson);
PushUP_min(rt);
}
int query_max(int L,int R,int l,int r,int rt)
{
if (L <= l && r <= R)
{
return MAX[rt];
}
int m = (l + r) >> 1;
int ret=0;
N[0]=0;
if (L <= m)
{
int tl=query_max(L , R , lson);
if (N[tl]>N[ret])
ret = tl;
}
if (R > m)
{
int tr=query_max(L , R , rson);
if (N[tr]>N[ret])ret = tr;
}
return ret;
}
int query_min(int L,int R,int l,int r,int rt)
{
if (L <= l && r <= R)
{
return MIN[rt];
}
int m = (l + r) >> 1;
int ret =0;
N[0]=999999999;
if (L <= m)
{
int tl=query_min(L , R , lson);
if (N[tl]<N[ret])
ret = tl;
}
if (R > m)
{
int tr=query_min(L , R , rson);
if (N[tr]<N[ret])ret = tr;
}
return ret;
}
void sovle(int l,int r)
{
if (l>r) return ;
int max_p=query_max(l , r , 1 , n , 1);
int min_p=query_min(l , r , 1 , n , 1);
long long num=N[max_p]*N[min_p];
int nl,nr;
if(max_p>min_p)
{
nl=min_p;
nr=max_p;
}
else
{
nr=min_p;
nl=max_p;
}
for (int i=nr-nl+1; i<=r-l+1; i++) ans[i]=max(ans[i],num);
sovle(l,min_p-1);
sovle(min_p+1,r);
}
int main()
{
while(~scanf("%d",&n))
{
getchar();
memset(ans,0,sizeof(ans));
for (int i=1; i<=n; i++)
N[i]=read();
Pos=0;
build_max(1 , n , 1);
build_min(1 , n , 1);
sovle(1,n);
for (int i=1; i<=n; i++)
printf("%I64d\n",ans[i]);
}
return 0;
}