#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100;
int n, a[N];
int nxt[N];
int pre[N];
int Max[5 * N];
int Lazy[10 * N];
void PushLazy(int Node) {
  if (!Lazy[Node]) return;
  Lazy[Node << 1] = max(Lazy[Node << 1], Lazy[Node]);
  Lazy[Node << 1 | 1] = max(Lazy[Node << 1 | 1], Lazy[Node]);
  Max[Node] = max(Max[Node], Lazy[Node]);
  Lazy[Node] = 0;
}
void Update(int i, int j, int val, int Node = 1, int L = 1, int R = n) {
  PushLazy(Node);
  if (i > R || j < L) return;
  if (L >= i && R <= j) {
    Lazy[Node] = val;
    PushLazy(Node);
    return;
  }
  int Mid = L + R >> 1;
  Update(i, j, val, Node << 1, L, Mid);
  Update(i, j, val, Node << 1 | 1, Mid + 1, R);
  Max[Node] = max(Max[Node << 1], Max[Node << 1 | 1]);
}
int Query(int i, int j, int Node = 1, int L = 1, int R = n) {
  PushLazy(Node);
  if (i > R || j < L) return -1e9;
  if (L >= i && R <= j) return Max[Node];
  int Mid = L + R >> 1;
  int Q1 = Query(i, j, Node << 1, L, Mid);
  int Q2 = Query(i, j, Node << 1 | 1, Mid + 1, R);
  return max(Q1, Q2);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  stack<int> st;
  for (int i = n; i >= 1; i--) {
    while (!st.empty() && a[st.top()] >= a[i]) st.pop();
    nxt[i] = (st.empty() ? n : st.top() - 1);
    st.push(i);
  }
  while (!st.empty()) st.pop();
  for (int i = 1; i <= n; i++) {
    while (!st.empty() && a[st.top()] >= a[i]) st.pop();
    pre[i] = (st.empty() ? 1 : st.top() + 1);
    st.push(i);
  }
  for (int i = 1; i <= n; i++) Update(1, nxt[i] - pre[i] + 1, a[i]);
  for (int i = 1; i <= n; i++) printf("%d ", Query(i, i));
  puts("");
  return 0;
}
