#include
#include
using namespace std;
// 判断是否为二叉搜索树或其镜像的前序遍历结果
bool isPreorder(vector& preorder, int start, int end) {
if (start >= end) {
return true;
}
int root = preorder[start];
int i;
for (i = start + 1; i <= end; i++) {
if (preorder[i] >= root) {
break;
}
}
int j;
for (j = i; j <= end; j++) {
if (preorder[j] < root) {
return false;
}
}
return isPreorder(preorder, start + 1, i - 1) && isPreorder(preorder, i, end);
}
// 获取二叉搜索树的后序遍历结果
void getPostorder(vector& preorder, int start, int end, vector& postorder) {
if (start > end) {
return;
}
int root = preorder[start];
int i;
for (i = start + 1; i <= end; i++) {
if (preorder[i] >= root) {
break;
}
}
getPostorder(preorder, start + 1, i - 1, postorder);
getPostorder(preorder, i, end, postorder);
postorder.push_back(root);
}
int main() {
int N;
cin >> N;
vector preorder(N);
for (int i = 0; i < N; i++) {
cin >> preorder[i];
}
if (isPreorder(preorder, 0, N - 1)) {
cout << 'YES' << endl;
vector postorder;
getPostorder(preorder, 0, N - 1, postorder);
for (int i = 0; i < N; i++) {
cout << postorder[i];
if (i < N - 1) {
cout << ' ';
}
}
} else {
cout << 'NO';
}
return 0;
}