题目链接:https://www.luogu.org/problem/P1160
#include<bits/stdc++.h>
using namespace std;
bool vis[100003];
list<int> s;
list<int>::iterator pos[100003];
int main(){
int n;
scanf("%d",&n);
s.push_front(1);
pos[1]=s.begin();
for(int i=2;i<=n;i++){
int k,p;
scanf("%d%d",&k,&p);
if(p==0){//插在k元素的左边
pos[i]=s.insert(pos[k],i);
}
else{//插在k元素的右边
list<int>::iterator it=pos[k];
++it;
pos[i]=s.insert(it,i);
}
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
int x;
scanf("%d",&x);
if(!vis[x]){
s.erase(pos[x]);
vis[x]=true;
}
}
for(list<int>::iterator it=s.begin();it!=s.end();it++){
printf("%d ",*it);
}
printf("\n");
return 0;
}
链表基本函数: