#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Node{int pre, nxt;};
struct Llist{
Node node[100005];
bool exist[100005];
int head, tail;
Llist(){
memset(node, 0, sizeof(node));
memset(exist, 0, sizeof(exist));
head = tail = -1;
}
void add(int x, int k, bool p){
exist[x] = 1;
if(head == -1){
head = tail = x;
node[x].pre = node[x].nxt = -1;
}
else if(p){
if(k != tail) node[node[k].nxt].pre = x;
node[x].nxt = node[k].nxt;
if(k != tail) node[k].nxt = x;
node[x].pre = k;
if(k == tail) tail = x;
}
else{
if(k != head) node[node[k].pre].nxt = x;
node[x].pre = node[k].pre;
if(k != head) node[k].pre = x;
node[x].nxt = k;
if(k == head) head = x;
}
}
void fake_del(int x){
exist[x] = 0;
}
void print(){
if(head == -1) return;
int now = head;
while(now != -1){
if(exist[now]) printf("%d ", now);
now = node[now].nxt;
}
}
} l;
int n, k, p, m, x;
int main(){
scanf("%d", &n);
l.add(1, -1, 1);
for(int i = 2; i <= n; i++){
scanf("%d%d", &k, &p);
l.add(i, k, p);
}
scanf("%d", &m);
for(int i = 1; i <= m; i++){
scanf("%d", &x);
l.fake_del(x);
}
l.print();
return 0;
}
手搓的双向列表,一开始0pts,瞅了瞅讨论区进食警示后人,#1改对了,但后4个点还是WA
……