#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<sstream>
#include<map>
#include<algorithm>
using namespace std;
int pre[1010];
int mirror;
int flag = 0;
vector<int>post;
void judge(int l, int r)
{
if (flag == 1)return;
int root = pre[l];
int index = l + 1;
if (mirror == 1)
{
while (index <= r && pre[index] >= root)index++;
for (int i = index; i <= r; ++i) {
if (pre[i] >= root) {
flag = 1;
return;
}
}
}
else if (mirror == 0)
{
while (index <= r && pre[index] < root)index++;
for (int i = index; i <= r; ++i) {
if (pre[i] < root) {
flag = 1;
return;
}
}
}
int llen = index - l - 1;
int rlen = r - index + 1;
if (llen > 0)judge(l + 1, index - 1);
if (rlen > 0)judge(index, r);
post.push_back(root);
}
int main()
{
//freopen("test.txt", "r", stdin);
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i)scanf("%d", &pre[i]);
if (n == 1) {
printf("YES\n");
printf("%d", pre[0]);
}
if (pre[1] >= pre[0])mirror = 1;
else if (pre[1] < pre[0])mirror = 0;
judge(0, n - 1);
if (flag == 1)printf("NO\n");
else {
printf("YES\n");
printf("%d", post[0]);
for (int i = 1; i < post.size(); ++i)printf(" %d", post[i]);
}
return 0;
}
23分,不知道哪里错了,但是思路很清楚