#include<iostream>
#include<vector>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
//insert函数中试着把指针的引用改成单纯的指针?wrong!!!
struct Node{
int data;
Node* left;
Node* right;
};
vector<int> le,pos;
Node* newNode(int v){
Node* node=new Node;
node->data=v;
node->left=node->right=NULL;
return node;
}
void L(Node* &root){
Node* temp=root->right;
root->right=temp->left;
temp->left=root;
root=temp;
}
void R(Node* &root){
Node* temp=root->left;
root->left=temp->right;
temp->right=root;
root=temp;
}
int getheight(Node* root){
if(root==NULL) return 0;
return max(getheight(root->left),getheight(root->right))+1;
}
void insert(Node* &root,int v){
if(root==NULL){
root=newNode(v);
return;
}else if(v<root->data){
insert(root->left,v);
int l=getheight(root->left);
int r=getheight(root->right);
if(l-r==2){
if(v<root->left->data)
R(root);
else{
L(root->left);
R(root);
}
}
}else{
insert(root->right,v);
int l=getheight(root->left);
int r=getheight(root->right);
if(r-l==2){
if(v>root->right->data)
L(root);
else{
R(root->right);
L(root);
}
}
}
}
Node* build(vector<int> data){
Node* root=NULL;
for(int i=0;i<data.size();i++){
insert(root,data[i]);
}
return root;
}
void leveltra(Node* root){
queue<Node*> q;
q.push(root);
while(!q.empty()){
Node* now=q.front();
q.pop();
le.push_back(now->data);
if(now->left!=NULL) q.push(now->left);
if(now->right!=NULL) q.push(now->right);
}
}
void _pos(Node* root){
if(root==NULL) return;
_pos(root->left);
_pos(root->right);
pos.push_back(root->data);
}
bool judge1(Node* root){
if(root==NULL) return true;
queue<Node*> q;
q.push(root);
bool shouldbeleaf=false;
while(!q.empty()){
Node* now=q.front();
q.pop();
if(shouldbeleaf==true&&(now->left!=NULL||now->right!=NULL)){
return false;
}
if(now->left==NULL&&now->right!=NULL){
return false;
}
if(now->left!=NULL) q.push(now->left);
if(now->right!=NULL) q.push(now->right);
else shouldbeleaf=true;
}
return true;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n;
cin>>n;
Node* root=NULL;
vector<int> data;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
data.push_back(temp);
}
root=build(data);
leveltra(root);
for(int i=0;i<le.size();i++){
if(i==0)
cout<<le[i];
else
cout<<' '<<le[i];
}
cout<<endl;
if(judge1(root)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}