#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include <ctype.h>
typedef struct node{
int data;
struct node* pre;
struct node* next;
}lnode,*linklist;
int main()
{
int n,i=1,a,op,m;
scanf("%d",&n);
linklist head,p,r,list;
//构建头结点
list=(linklist)malloc(sizeof(lnode));
list->next=list;//可省略
list->pre=list;
//插入第一个同学
p=(linklist)malloc(sizeof(lnode));
p->data=1;
list->next=p;
list->pre=p;
p->next=list;
p->pre=list;
while(i<n)
{
i++;
scanf("%d%d",&a,&op);
//寻找data为a的结点
r=list->next;//指向头结点后面的节点
while(r!=list&&r->data!=a)
{
r=r->next;
}
//在右边插入结点
if(op==1)
{
//在双向链表中插入一个节点需要更改四个指针
p=(linklist)malloc(sizeof(lnode));
p->data=i;
p->pre=r;//新插入结点的双指针
p->next=r->next;
r->next->pre=p;//下一节点的左指针
r->next=p; //上一节点的右指针
}
else
{
p=(linklist)malloc(sizeof(lnode));
p->data=i;
p->next=r;//新插入结点的双指针
p->pre=r->pre;
r->pre->next=p;//上一节点的左指针
r->pre=p; //后一节点的左指针
}
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&a);
//双向链表删除节点
//寻找数据域符合的节点
r=list->next;//先使其指向头结点后面的节点
while(r!=list&&r->data!=a)
{
r=r->next;
}
if(r!=list)//没回来,说明找到了
{
r->pre->next=r->next;
r->next->pre=r->pre;
free(r);//链表删除记得free
}
}
//沿一个方向输出编号
p=list->next;
while(p!=list)
{
printf("%d ",p->data);
p=p->next;
}
return 0;
}