链表主体 by 我同机房的大佬
常数优化+ find() 函数 by Me
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
int x=0,w=1;
char ch=0;
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*w;
}
void write(int x){
if(x<0){
putchar('-');
x=-x;
}
static int sta[35];
int top=0;
do{
sta[top++]=x%10,x/=10;
}while(x);
while(top)putchar(sta[--top]+'0');
}
template<typename T>
struct List {
public:
protected://使外界不能访问
int len;
struct node {
T v;
node *pre, *nxt;
} *head, *tail;
public:
class iterator {
friend List;//能使用node
public:
protected://修复BUG 6.3
node *q;
public:
T operator * (){
return q->v;
}
bool operator != (const iterator &x) {//修复BUG 6.3
if (this->q== x.q) {
return 0;
}
return 1;
}
iterator operator = (const iterator &x) {
q = x.q;
return x;
}
iterator operator ++ () {
q = q->nxt;
iterator x;
x.q = q;
return x;
}
iterator operator ++ (int) {
q = q->nxt;
iterator x;
x.q = q;
return x;
}
};
public:
friend iterator;//能使用q
iterator begin() {
iterator x;
x.q = head->nxt;
return x;
}
iterator end() {
iterator x;
x.q = tail;
return x;
}
List() {//7.21 添加
len = 0;
head = new node();
tail = new node();
head->nxt = tail;
tail->pre = head;
}
void insert(int x, const T &v) {
len++;
node *q = new node(), *p = head;
for (int i = 1; i <= x; i++) p = p->nxt;
q->nxt = p->nxt; q->nxt->pre = q;
p->nxt = q; q->v = v; q->pre = p;
}
int size() {
return len;
}
void print(int l = 1, int le = -1) {//添加新功能 6.3,可不传参
iterator it;
it.q = head;
it++;//修复BUG 7.21
for (int i = 1; i <= l; ++i) it++;//利用迭代器输出
if (le != -1) {
for (int i = 1; i <= le; ++i) {
write(*it);putchar(' ');
it++;
}
cout << "\n";
}
else {
for (int i = 1; i <= len && it.q->nxt != tail; ++i) {
write(*it);putchar(' ');
it++;
}
write(*it);
cout << "\n";
}
}
void erase(int x) {//O(n)
node *p = head;
len--;
for (int i = 1; i <= x; i++) p = p->nxt;
p->pre->nxt = p->nxt;
p->nxt->pre = p->pre;
delete p;
}
void clear() {
len = 0;
node *h = head;
while (h != tail) {
h = h->nxt;
delete head->pre;
};
}
bool empty() {
return len == 0;
}
void push_back(const T &v) {
len++;
node *p = new node();
tail->pre->nxt = p;
p->pre = tail->pre;
p->v = v;
tail->pre = p;
p->nxt = tail;
}
void push_front(const T &v) {
len++;
node *p = new node();
head->nxt->pre = p;
p->nxt = head->nxt;
p->v = v;
head->nxt = p;
p->pre = head;
}
void pop_front() {
len--;
node *p = head->nxt;
head->nxt = p->nxt;
p->nxt->pre = head;
delete p;
}
void pop_back() {
len--;
node *p = tail->pre;
p->pre->nxt = tail;
tail->pre = p->nxt;
delete p;
}
List operator = (List &l) {//添加等号6.3
clear();
iterator it;
for (it = l.begin(); it != l.end(); it++) {
push_back(*it);
}
return l;
}
int find(const T n) {//返回下标
iterator it;
int id=1;
for(it=begin();it!=end();it++){
if(*it==n) return id;
id++;
}
return size()+1;
}
};
int n,m,p,k;
List<int>a;
map<int,int>mp;
int main(){
n=read();
a.insert(0,1);
for(int i=2;i<=n;++i){
k=read();p=read();
if(p){
a.insert(a.find(k),i);//插入右边
}else{
a.insert(a.find(k)-1,i);//插入左边
}
}
m=read();
while(m--){
k=read();
if(!mp[k]){
a.erase(a.find(k));
mp[k]=1;
}
//防止多次删除导致的RE
}
a.print(0,-1);//-1代表输出全部
return 0;
}