#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
bool isMirror;
vector<int> pre;
vector<int> post;
void getpost(int root,int tail)
{
if(root>tail) return ;
int i=root+1,j=tail;
if(!isMirror)
{
while(i<=tail&&pre[i]<pre[root]) i++; //从左到右找到比root大的第一个结点
while(j>root&&pre[j]>=pre[root]) j--;//从右到左找到比root小的第一个结点
}
else
{
while(i<=tail&&pre[i]>=pre[root]) i++;
while(j>root&&pre[j]<pre[root]) j--;
}
if(i-j!=1) return ;
getpost(root+1,i-1);// 不是映像:所有比root小的
getpost(j+1,tail);
post.push_back(pre[root]);
}
int main()
{
int n;
scanf("%d",&n);
pre.resize(n);
for(int i=0;i<n;i++)
scanf("%d",&pre[i]);
getpost(0,n-1);
if(post.size()!=n)
{
isMirror=true;
post.clear();
getpost(0,n-1);
}
if(post.size()==n)
{
printf("YES\n%d",post[0]);
for(int i=1;i<post.size();i++)
printf(" %d",post[i]);
}
else
printf("NO\n");
return 0;
}