/*栈的模板可以用数组,单链表,以及stack堆栈来实现 */
/*建议电脑查看*/ 
#include <cstdio> 
#include <stack> /*堆栈*/
using namespace std;
void print( stack<int> a, int n );
void clear( stack<int> b );	/*清空*/ 
int main() 
{
	stack<int> s;	 /*定义一个堆栈类型变量*/ 
	int number;
	int out[5] = { 2,3,5,4,1, }; 
	int index = 0;
	int i, j, k, n;
	
	/* 输入 1 2 3 4 5 判断有没有可能输出是 2 3 5 4 1 */ 
	scanf("%d", &n );	//下一行输入n个元素
	for( i=0; i<n; i++ ){
		scanf("%d", &number );
		s.push( number ); 	//将输入的数压入栈顶 
		if( s.top() == out[index] ){	//判断栈顶元素是否与将要输出的元素是否相等 
			while( 1 ){		//加一层循环 
				printf("%d ", s.top() );	//输出栈顶元素 
				s.pop();	//弹出栈顶元素 
				index ++;	//数组下标加一,指向下一个将要输出的元素 
				/*判断数组是否越界以及栈顶元素是否等于将要输出的元素*/ 
				if( index>=5 || s.top() != out[index] )	 
					break;	//不等则终止循环 
			}
		}
	}
	printf("\n");
	if( s.empty() )	//判断堆栈是否为空 
		printf("Yes\n");
	else{
		clear( s ); //清空 
		printf("No\n");
	}

	for( i=0; i<6; i++ )
		s.push( i ); 
	print( s, s.size() );	//遍历输出,自栈顶向下 
	//printf("\n");
	printf("%d\n", s.size() );	//返回并输出元素个数 
	
	return 0;
}

void print( stack<int> a, int n )	//不会改变主函数的堆栈 
{
	int i;
	
	for( i=0; i<n; i++ ){
		printf("%d ", a.top() );
		a.pop();
	}
	printf("\n");
}

void clear( stack<int> b )
{
	while( b.size() )
		b.pop();
}