#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef int Status;
#define OK 1
#define ERROR 0

/*********双向链表以及其结点类型定义**************/
typedef struct DuLNode{
	ElemType data; // 数据域
	struct DuLNode *prior; // 前一结点的指针域
	struct DuLNode *next; // 后一结点的指针域
} DuLNode, *DuLinkList;

/*********创建双向循环链表***********/
void ListCreate_DuL(DuLinkList &L) {
	L = (DuLinkList) malloc(sizeof(DuLNode)); // 创建一个头结点
	L->prior = L; // 开始时前后指针都指向自身
	L->next = L;
}

DuLinkList GetElemP_DuL(DuLinkList L, int i) {
	// L为带头结点的单链表的头指针。
	// 当第i个元素存在时,返回其地址,否则返回NULL
	DuLinkList p;
	p = L->next;
	int j = 1; // 初始化,p指向第一个结点,j为计数器
	while (p != L && j < i) { //顺指针向后查找,直到p指向第i个元素或p为空
		p = p->next;
		++j;
	}
	if (p == L && j < i)
		return NULL; // 第i个元素不存在
	else
		return p;
} // GetElem_L

Status ListInsert_DuL(DuLinkList &L, int i, ElemType e) { //算法2.18
	// 在带头结点的双链循环线性表L的第i个元素之前插入元素e,
	// i的合法值为1≤i≤表长+1。
	DuLinkList p, s;
	if (!(p = GetElemP_DuL(L, i))) // 在L中确定第i个元素的位置指针p
		return ERROR; // p=NULL, 即第i个元素不存在
	if (!(s = (DuLinkList) malloc(sizeof(DuLNode))))
		return ERROR;
	s->data = e;
	s->prior = p->prior;
	p->prior->next = s;
	s->next = p;
	p->prior = s;
	return OK;
} // ListInsert_DuL

Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e) {//算法2.19
	// 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长
	DuLinkList p;
	if (!(p = GetElemP_DuL(L, i))) // 在L中确定第i个元素的位置指针p
		return ERROR; // p=NULL, 即第i个元素不存在
	e = p->data;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	free(p);
	return OK;
} // ListDelete_DuL

/******显示双向链表中的数据**********/
void ListShow_DuL(DuLinkList L){
	DuLinkList p = L->next;
	int i = 0;
	while(p != L){		// 注意这里的结束条件
		if(i++){
			putchar(' ');
		}
		printf("%d", p->data);
		p = p->next;
	}
	putchar('\n');		// 注意换行
}

int main(){

	int s, i, e;	// 定义存储指令、下标以及元素的变量
	DuLinkList L;
	ListCreate_DuL(L);
	while(scanf("%d", &s) != EOF){
		switch(s){
		case 0:		// show
			ListShow_DuL(L);
			break;
		case 1:		// insert
			scanf("%d%d", &i, &e);
			ListInsert_DuL(L, i, e);
			break;
		case 2:		// delete
			scanf("%d", &i);
			ListDelete_DuL(L, i, e);
			break;
		}
	}

	return 0;
}

/**************************************************************
	Problem: 2140
	User: admin
	Language: C++
	Result: Accepted
	Time:14 ms
	Memory:1144 kb
****************************************************************/