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

typedef enum { OK, ERROR } Status;
typedef int ElemType;
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)
{
  DuLinkList p;
  int j;

  p = L->next;
  j = 1;
  while (p != L && j < i) {
    p = p->next;
    ++j;
  }
  if (p == L && j < i) {
    return NULL;
  }
  else {
    return p;
  }
}

Status ListInsert_DuL(DuLinkList *L, int i, ElemType e)
{
  DuLinkList p, s;

  if (!(p = GetElemP_DuL(*L, i))) {
    return ERROR;
  }
  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;
}

Status ListDelete_DuL(DuLinkList *L, int i, ElemType *e)
{
  DuLinkList p;

  if (!(p = GetElemP_DuL(*L, i))) {
    return ERROR;
  }
  *e = p->data;
  p->prior->next = p->next;
  p->next->prior = p->prior;
  free(p);
  return OK;
}

void ListPrint_DuL(DuLinkList L)
{
  DuLinkList p;

  for (p = L->next; p->next != L; p = p->next) {
    printf("%d ", p->data);
  }
  if (p != L) {
    printf("%d\n", p->data);
  }
}

int main(void)
{
  int cmd, i, e;
  DuLinkList L;

  ListCreate_DuL(&L);
  while (scanf("%d", &cmd) != EOF) {
    switch (cmd) {
    case 0:
      ListPrint_DuL(L);
      break;
    case 1:
      scanf("%d %d", &i, &e);
      ListInsert_DuL(&L, i, e);
      break;
    case 2:
      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
****************************************************************/