#include <cstdio>
#include <queue>	/*队列queue头文件*/ 
#include <algorithm>
using namespace std;
void print( queue<int> a, int n );	//自定义遍历输出函数 
void is_empty( queue<int> d ); 
void clear( queue<int> &q );	//自定义清空函数 
int main()
{
	queue <int> q;	//定义一个队列,默认deque双端队列类型*/ 
	int number;
	int i, j, k, n;
	
	scanf("%d", &n );	//下一行输入n个数 
	for( i=0; i<n; i++ ){
		scanf("%d", &number );
		q.push( number ); 	/*压入元素至队列的队尾*/ 
	}
	
	print( q, q.size() );	/*遍历输出队列 不会改变主函数里的队列*/ 
	q.pop();	/*弹出队列的第一个元素 且不返回被弹出元素的值*/ 
	q.pop();
	print( q, q.size() );
	 
	printf("%d\n", q.front() ); /*访问第一个队列元素并输出*/ 
	printf("%d\n", q.back() );	/*访问队列的最后一个元素并输出*/ 
	printf("%d\n", q.size() );	/*返回队列的大小并输出*/
		
	q = queue<int> ();	/*用空队列赋值,清空队列*/
	while( !q.empty() ) q.pop(); /*逐个弹出,清空队列*/
	clear( q );	/*自定义clear()函数,清空队列, 最高效的方法*/ 
	is_empty( q );	/*判断是否为空队列*/ 
	 	
	return 0;
}

void print( queue<int> a, int n )	/*不会改变主函数里的队列*/ 
{
	int i;
	
	for( i=0; i<n; i++ ){
		printf("%d ", a.front() );
		a.pop();	/*主函数的队列不被影响*/ 
	}
	printf("\n");
}

void is_empty( queue<int> d )
{
	if( d.empty() )
		printf("0\n");		/*判断队列是否为空*/ 
	else
		printf("1\n");
}

void clear( queue<int> &q )	//定义这样的形参会改变主函数里的队列*/ 
{
	queue<int> empty;
	swap( empty, q );	//清空主函数里的队列 
}