#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 1e3 + 7;
const int mod = 1e9 + 7;
ll a[N], tr[N];
ll n, p = 0;
bool err = 0;
void build(int idx, int rt, int L, int R) {
    if (err) return;

    int lson = L, rson = L;
    while (rson <= R) {
        if (a[rson] >= a[rt]) break;
        ++rson;
    }
    rep(i, rson, R) if (a[i] < a[rt]) {
        err = 1;
        return;
    }
    if (lson < rson && a[lson] < a[rt]) {
        build(idx * 2, lson, lson + 1, rson - 1);
    }
    if (rson <= R and a[rson] >= a[rt]) {
        build(idx * 2 + 1, rson, rson + 1, R);
    }if (rt >= 1 && rt <= n) tr[++p] = a[rt];
}
void build2(int idx, int rt, int L, int R) {
    if (err) return;

    int lson = L, rson = L;
    while (rson <= R) {  // change

        if (a[rson] < a[rt]) break;
        ++rson;
    }
    // cout << rt << ' ' << L << ' ' << R << ' ' << lson << ' ' << rson << endl;
    rep(i, rson, R) if (a[i] >= a[rt]) {
        err = 1;
        return;
    }
    if (lson < rson && a[lson] >= a[rt]) {
        build2(idx * 2, lson, lson + 1, rson - 1);
    }
    if (rson <= R and a[rson] < a[rt]) {
        build2(idx * 2 + 1, rson, rson + 1, R);
    }if (rt >= 1 && rt <= n) tr[++p] = a[rt];
}
int main() {
    sc(n);
    rep(i, 1, n) sc(a[i]);
    build(1, 1, 2, n);
    // rep(i, 1, p) printf("%lld%c", tr[i], i == p ? '\n' : ' ');
    if (p == n && !err) {
        puts("YES");
        // post(1);
        rep(i, 1, n) printf("%lld%c", tr[i], i == n ? '\n' : ' ');
    } else {
        p = 0;
        err = 0;
        memset(tr, 0, sizeof tr);
        build2(1, 1, 2, n);
        if (p == n && !err) {
            puts("YES");
            p = 0;
            // post(1);
            rep(i, 1, n) printf("%lld%c", tr[i], i == n ? '\n' : ' ');
        } else {
            puts("NO");
        }
    }
    return 0;
}