solution
#include <iostream>
#include <vector>
using namespace std;
bool isMirror;
vector<int> pre, post;
void getpost(int root, int tail)
{
if (root > tail)
return;
int i = root + 1, j = tail;
if (!isMirror)
{
while (i <= tail && pre[root] > pre[i])
i++;
while (j > root && pre[root] <= pre[j])
j--;
}
else
{
while (i <= tail && pre[root] <= pre[i])
i++;
while (j > root && pre[root] > pre[j])
j--;
}
if (i - j != 1)
return;
getpost(root + 1, j);
getpost(i, tail);
post.push_back(pre[root]);
}
int main()
{
int n;
cin >> n;
pre.resize(n);
for (int i = 0; i < n; i++)
cin >> pre[i];
getpost(0, n - 1);
if (post.size() != n)
{
isMirror = true;
post.clear();
getpost(0, n - 1);
}
if (post.size() != n)
cout << "NO";
else
{
cout << "YES\n";
for (int i = 0; post[i]; i++)
{
if (i)
cout << " ";
cout << post[i];
}
}
}