#includeusing namespace std;bool vis[1000003];list stus;list ::iterator pos[1000003];//用来存放每一项的迭代器 这样遍历链表的时间能从O(n)变成O(1)int main(){ int n; scanf("%d",&n); stus.push_front(1);//插入1到头部 pos[1] = stus.begin();//放入迭代器的开始 相当于存入的位置在哪里 for(int i = 2;i <= n;i++){ int k,p; scanf("%d %d",&k,&p); if(p==0){ //在左边 pos[i] = stus.insert(pos[k],i);//插入左边返回一个迭代器 } else{ list ::iterator it = pos[k];//取出第k个元素迭代器的位置 it++; pos[i] = stus.insert(it,i); } } int m = 0; scanf("%d",&m); while(m--){ int x = 0; scanf("%d",&x); if(!vis[x]){ vis[x]=true;//标记他被删过了 stus.erase(pos[x]);//传入他的迭代器 } } for(list ::iterator it = stus.begin();it!=stus.end();it++){ printf("%d ",*it); } printf("\n"); return 0; }