#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
struct Node{
int key;
int left, right;
}node[1010];
int N;
int a[1010], pre[1010];
int isSame(int a[], int b[]){
for(int i = 0; i < N; i++){
if(a[i] != b[i]) return 0;
}
return 1;
}
void insert(int &index, int x, int addr){
if(index == -1){
index = addr;
return;
}
if(x < node[index].key) insert(node[index].left, x, addr);
else if(x >= node[index].key) insert(node[index].right, x, addr);
}
int cnt = 0;
void preOrder(int index, int flag){
if(index == -1) return;
pre[cnt++] = node[index].key;
if(flag){
preOrder(node[index].left, flag);
preOrder(node[index].right, flag);
}else{
preOrder(node[index].right, flag);
preOrder(node[index].left, flag);
}
}
void postOrder(int index, int flag){
if(index == -1) return;
if(flag){
postOrder(node[index].left, flag);
postOrder(node[index].right, flag);
}else{
postOrder(node[index].right, flag);
postOrder(node[index].left, flag);
}
cnt++;
printf("%d", node[index].key);
if(cnt < N) putchar(' ');
}
int main(){
scanf("%d", &N);
for(int i = 0; i < N; i++){
node[i].left = node[i].right = -1;
}
int x, first = -1;
for(int i = 0; i < N; i++){
scanf("%d", &a[i]);
node[i].key = a[i];
insert(first, a[i], i);
}
int flag = 1;
cnt = 0;
preOrder(first, flag);
if(isSame(pre, a)){
printf("YES\n");
cnt = 0;
postOrder(first, flag);
return 0;
}
flag = 0;
cnt = 0;
preOrder(first, flag);
if(isSame(pre, a)){
printf("YES\n");
cnt = 0;
postOrder(first, flag);
return 0;
}
printf("NO\n");
return 0;
}