1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
| #include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long LL;
const int INF = 1<<30;
int getint() {
int r = 0, k = 1; char c = getchar();
for (; '0' > c || c > '9'; c = getchar()) if (c == '-') k = -1;
for (; '0' <= c && c <= '9'; c = getchar()) r = r * 10 - '0' + c;
return r * k;
}
int n, q;
const int N = 100005;
struct edge_type {
int to, next;
} edge[N];
int cnte = 0, h[N];
void ins(int u, int v) {
edge[++cnte].to = v;
edge[cnte].next = h[u];
h[u] = cnte;
}
int dfs_clock = 0;
int son[N], fa[N], dep[N], siz[N], top[N], tid[N], dfn[N], ans[N<<2], lazy[N<<2];
int dfs1(int now, int father, int deep) {
son[now] = 0; siz[now] = 1; dep[now] = deep; fa[now] = father;
for (int i = h[now]; i; i = edge[i].next) {
siz[now] += dfs1(edge[i].to, now, deep+1);
if (siz[edge[i].to] > siz[son[now]]) son[now] = edge[i].to;
}
return siz[now];
}
void dfs2(int now, int father, int tp) {
top[now] = tp; tid[now] = ++dfs_clock;
if (son[now]) {
dfs2(son[now], now, tp);
for (int i = h[now]; i; i = edge[i].next) {
if (edge[i].to == son[now]) continue;
dfs2(edge[i].to, now, edge[i].to);
}
}
dfn[now] = dfs_clock;
}
void pu(int now) { ans[now] = ans[now<<1] + ans[now<<1|1]; }
void pd(int now, int l, int mid, int r) {
if (lazy[now] == 1) {
lazy[now<<1] = lazy[now<<1|1] = 1;
ans[now<<1] = mid-l+1;
ans[now<<1|1] = r-mid;
lazy[now] = 0;
return;
}
if (lazy[now] == -1) {
lazy[now<<1] = lazy[now<<1|1] = -1;
ans[now<<1] = 0;
ans[now<<1|1] = 0;
lazy[now] = 0;
}
}
void chan0(int now, int l, int r, int ll, int rr) {
if (ll <= l && r <= rr) {
ans[now] = 0;
lazy[now] = -1;
return;
}
int mid = (l + r) >> 1;
pd(now, l, mid, r);
if (ll <= mid) chan0(now << 1, l, mid, ll, rr);
if (rr > mid) chan0(now << 1 | 1, mid + 1, r, ll, rr);
pu(now);
}
void chan1(int now, int l, int r, int ll, int rr) {
if (ll <= l && r <= rr) {
ans[now] = r - l + 1;
lazy[now] = 1;
return;
}
int mid = (l + r) >> 1;
pd(now, l, mid, r);
if (ll <= mid) chan1(now << 1, l, mid, ll, rr);
if (rr > mid) chan1(now << 1 | 1, mid + 1, r, ll, rr);
pu(now);
}
int query(int now, int l, int r, int ll, int rr) {
if (ll <= l && r <= rr) return ans[now];
int mid = (l + r) >> 1, ret = 0;
pd(now, l, mid, r);
if (ll <= mid) ret = query(now << 1, l, mid, ll, rr);
if (rr > mid) ret += query(now << 1 | 1, mid + 1, r, ll, rr);
return ret;
}
void install (int x) {
int opt = 0;
int y = x;
while (x) {
opt += query(1, 1, n, tid[top[x]], tid[x]);
chan1(1, 1, n, tid[top[x]], tid[x]);
x = fa[top[x]];
}
printf("%d\n", dep[y] - opt);
}
void uninstall (int x) {
printf("%d\n", query(1, 1, n, tid[x], dfn[x]));
chan0(1, 1, n, tid[x], dfn[x]);
}
int main() {
n = getint();
int x;
for (int i = 1; i < n; ++i) {
x = getint();
ins(x+1, i+1);
}
dfs1(1, 0, 1);
dfs2(1, 0, 1);
q = getint();
char ope[15];
for (int i = 0; i < q; ++i) {
scanf("%s", ope);
x = getint(); ++x;
if (ope[0] == 'i') install(x);
else uninstall(x);
}
}
|