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
| #include <bits/stdc++.h> #define MAXN 100005 #define INF 1e9 #define ls (l+r<<1) #define rs (l+r<<1|1) #define mid (l+r>>1) using namespace std;
int n, x, q, cnt, head[MAXN], tag[MAXN*4], sum[MAXN*4]; int Index, son[MAXN], f[MAXN], dep[MAXN], size[MAXN], id[MAXN], top[MAXN]; char opt[100]; struct Edge {int next, to;} edge[MAXN*2];
void addedge(int from, int to) { edge[++cnt].next=head[from]; edge[cnt].to=to; head[from]=cnt; }
void dfs1(int x, int fa, int deep) { dep[x]=deep; f[x]=fa; size[x]=1; int maxson=-1; for(int i=head[x]; i; i=edge[i].next) { int to=edge[i].to; if(to==fa) continue; dfs1(to, x, deep+1); size[x]+=size[to]; if(size[to]>maxson) maxson=size[to], son[x]=to; } }
void dfs2(int x, int topf) { id[x]= ++Index; top[x]=topf; if(!son[x]) return; dfs2(son[x], topf); for(int i=head[x]; i; i=edge[i].next) { int to=edge[i].to; if(to==son[x] || to==f[x]) continue; dfs2(to, to); } }
void down(int root, int l, int r) { if(tag[root]==-1) return; sum[ls]=(mid-l+1)*tag[root]; sum[rs]=(r-mid)*tag[root]; tag[ls]=tag[root]; tag[rs]=tag[root]; tag[root]=-1; }
void update(int root, int l, int r, int x, int y, int z) { if(x>r || y<l) return ; if(x<=l && y>=r) { sum[root]=(r-l+1)*z; tag[root]=z; return; } down(root, l, r); update(ls, l, mid, x, y, z); update(rs, mid+1, r, x, y, z); sum[root]=sum[ls]+sum[rs]; }
void act(int x, int y) { while(top[x]!=1) { update(1, 1, n, id[top[x]], id[x], y); x=f[top[x]]; } update(1, 1, n, id[1], id[x], y); }
int main() { memset(tag, -1, sizeof(-1)); scanf("%d", &n); for(int i=2; i<=n; i++) { scanf("%d", &x); addedge(i, x+1); addedge(x+1, i); } dfs1(1, 0, 1); dfs2(1, 1); scanf("%d", &q); for(int i=1; i<=q; i++) { scanf("%s%d", opt, &x); x++; int temp=sum[1]; if(opt[0]=='i') { act(x, 1); printf("%dn", sum[1]-temp); } if(opt[0]=='u') { update(1, 1, n, id[x], id[x]+size[x]-1, 0); printf("%dn", temp-sum[1]); } } }
|