#include <bits/stdc++.h>
using namespace std;
struct node {
  int r, l;
};
int p[2000010], a[2000010], b[2000010], ans[2000010], flag[2000010], R[2000010],
    L[2000010], lR[2000010], lL[2000010], n, w[2000010], sum[2000010],
    maxx[2000010], psum[2000010], ansum;
vector<int> c[1000010];
void build(int num, int r, int l) {
  if (r == l) {
    R[num] = r - 1;
    L[num] = l + 1;
    return;
  }
  int mid = (r + l) >> 1;
  build(num << 1, r, mid);
  build((num << 1) | 1, mid + 1, l);
  return;
}
void putr(int num) {
  lR[num * 2] = lR[num * 2 + 1] = R[num * 2] = R[num * 2 + 1] = lR[num];
  lR[num] = 0;
}
void putl(int num) {
  lL[num * 2] = lL[num * 2 + 1] = L[num * 2] = L[num * 2 + 1] = lL[num];
  lL[num] = 0;
}
node find(int num, int r, int l, int x) {
  if (r == l) {
    node ans;
    ans.r = R[num];
    ans.l = L[num];
    return ans;
  }
  if (lR[num]) putr(num);
  if (lL[num]) putl(num);
  int mid = (r + l) >> 1;
  if (x <= mid) return find(num << 1, r, mid, x);
  return find((num << 1) | 1, mid + 1, l, x);
}
void updater(int num, int r, int l, int x, int y, int p) {
  if (x <= r && l <= y) {
    R[num] = p;
    lR[num] = p;
    return;
  }
  if (lR[num]) putr(num);
  if (lL[num]) putl(num);
  int mid = (r + l) >> 1;
  if (x <= mid) updater(num << 1, r, mid, x, y, p);
  if (mid < y) updater((num << 1) | 1, mid + 1, l, x, y, p);
}
void updatel(int num, int r, int l, int x, int y, int p) {
  if (x <= r && l <= y) {
    L[num] = p;
    lL[num] = p;
    return;
  }
  if (lR[num]) putr(num);
  if (lL[num]) putl(num);
  int mid = (r + l) >> 1;
  if (x <= mid) updatel(num << 1, r, mid, x, y, p);
  if (mid < y) updatel((num << 1) | 1, mid + 1, l, x, y, p);
}
void change(int num, int r, int l, int x, int y, int z) {
  if (x <= r && l <= y) {
    if (ans[num] != 0)
      ans[num] = min(ans[num], z);
    else
      ans[num] = z;
    return;
  }
  int mid = (r + l) >> 1;
  if (x <= mid) change(num << 1, r, mid, x, y, z);
  if (mid < y) change((num << 1) | 1, mid + 1, l, x, y, z);
}
void add1(int num, int r, int l, int x, int y) {
  if (r == l) {
    psum[num] += y;
    if (psum[num])
      maxx[num] = r;
    else
      maxx[num] = 0;
    return;
  }
  int mid = (r + l) / 2;
  if (x <= mid)
    add1(num * 2, r, mid, x, y);
  else
    add1(num * 2 + 1, mid + 1, l, x, y);
  maxx[num] = max(maxx[num * 2], maxx[num * 2 + 1]);
}
void comeback(int x, int y) {
  node ans = find(1, 1, n, x);
  flag[x] = 0;
  if (w[ans.r] == 1) {
    change(1, 1, n, ans.r, (ans.r + ans.l) / 2, y);
  }
  if (w[ans.l] == 1) {
    change(1, 1, n, (ans.r + ans.l) / 2 + 1, ans.l, y);
  }
  updatel(1, 1, n, ans.r, x, ans.l);
  updater(1, 1, n, x, ans.l, ans.r);
  if (x - ans.r > 1) add1(1, 1, n, (x - ans.r) / 2, -1);
  if (ans.l - x > 1) add1(1, 1, n, (ans.l - x) / 2, -1);
  if (ans.l - ans.r > 1) add1(1, 1, n, (ans.l - ans.r) / 2, 1);
}
void add(int x, int y) {
  node ans = find(1, 1, n, x);
  if (w[x] == 1) change(1, 1, n, (ans.r + x) / 2 + 1, (x + ans.l) / 2, y);
  if (!flag[x]) {
    if (x - ans.r > 1) add1(1, 1, n, (x - ans.r) / 2, 1);
    if (ans.l - x > 1) add1(1, 1, n, (ans.l - x) / 2, 1);
    if (ans.l - ans.r > 1) add1(1, 1, n, (ans.l - ans.r) / 2, -1);
  }
  flag[x] = 1;
  if (x != 1) updatel(1, 1, n, ans.r, x - 1, x);
  if (x != n) updater(1, 1, n, x + 1, ans.l, x);
}
void getans(int num, int r, int l, int x) {
  if (ans[num]) x = min(ans[num], x);
  if (r == l) {
    sum[r] = x;
    return;
  }
  int mid = (r + l) / 2;
  getans(num * 2, r, mid, x);
  getans(num * 2 + 1, mid + 1, l, x);
}
int main() {
  int i, j, tot = 0;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    p[++tot] = a[i];
  }
  sort(p + 1, p + tot + 1);
  int l1 = unique(p + 1, p + tot + 1) - p - 1;
  for (i = 1; i <= n; i++) {
    b[i] = lower_bound(p + 1, p + l1 + 1, a[i]) - p;
    c[b[i]].push_back(i);
  }
  build(1, 1, n);
  for (i = 1; i <= n; i++) flag[i] = 1;
  for (i = 1; i <= l1; i++) {
    int h = c[i].size();
    for (j = 0; j < h; j++) {
      int x = c[i][j];
    }
    for (j = 0; j < h; j++) {
      int x = c[i][j];
      w[x] = 1;
      if (w[x + 1] == 1 || w[x - 1] == 1 || x == 1 || x == n) add(x, p[i]);
      if (w[x + 1] == 0 && w[x - 1] == 0 && x != 1 && x != n) comeback(x, p[i]);
      if (w[x - 1] == 0 && w[x - 2] != 0 && x - 1 != 1) comeback(x - 1, p[i]);
      if (w[x - 1] == 1) add(x - 1, p[i]);
      if (w[x + 1] == 0 && w[x + 2] != 0 && x + 1 != n) comeback(x + 1, p[i]);
      if (w[x + 1] == 1) add(x + 1, p[i]);
    }
    ansum = max(ansum, maxx[1]);
  }
  printf("%d\n", ansum);
  getans(1, 1, n, 1000000007);
  for (i = 1; i <= n; i++) printf("%d ", sum[i]);
}
