#include <bits/stdc++.h>
using namespace std;
int n, m;
int r[100010];
int l[100010];
int vis[100010];
int idx;
void init() {
r[0] = 1;
l[1] = 0;
r[1] = -1;//先把第一个同学安排进入队列,左手连着0节点,右手连 -1 表示空
idx = 2;
}
void add(int k) {
r[idx] = r[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx;
idx++;
}
void remove(int k) {
r[l[k]] = r[k];
l[r[k]] = l[k];
vis[k] = 1;//将这个同学标记为已删除
}
int main() {
cin >> n;
n--;
init();
while (n--) {
int k, p;
cin >> k >> p;
if (p == 1) {
add(k);
} else {
add(l[k]);
}
}
cin >> m;
while (m--) {
int k;
cin >> k;
if (vis[k] == 0)
remove(k);
}
for (int i = r[0]; i != -1; i = r[i]) {
cout << i << " ";
}
}
水一发,就是维护普通的双向链表,无法就是把value 换成对应的下表值 idx
还有就是有重复删除的标记一下