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
| #include<bits/stdc++.h> using namespace std; #define ll long long #define il inline #define ls(x) (x<<1) #define rs(x) (ls(x)|1) #define maxn 200005 #define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); int in[maxn],out[maxn],cnt=0,a[maxn]; vector<int> g[maxn]; il void dfs(int x,int fa){ in[x]=++cnt; a[cnt]=x; for(auto i:g[x]){ if(i==fa)continue; else{ dfs(i,x); } } out[x]=cnt; } int w[maxn]; struct FFF{ int l,r; int op; int cl; bool rev; int mid(){return l+r>>1;} int len(){return r-l+1;} }t[maxn*4]; int n; void up(int o){ t[o].op=t[ls(o)].op+t[rs(o)].op; t[o].cl=t[ls(o)].cl+t[rs(o)].cl; } void build(int l=1,int r=n,int o=1){ t[o].l=l;t[o].r=r; t[o].op=0; if(l==r){ t[o].cl=1; if(w[l]==1)swap(t[o].op,t[o].cl); return; } int mid=l+r>>1; build(l,mid,ls(o)); build(mid+1,r,rs(o)); up(o); } void down(int o){ if(t[o].rev){ for(int i=0;i<=1;++i){ t[ls(o)|i].rev^=1; swap(t[ls(o)|i].op,t[ls(o)|i].cl); } t[o].rev=0; } } void add(int l,int r,int o=1){ if(l<=t[o].l&&t[o].r<=r){ t[o].rev^=1; swap(t[o].op,t[o].cl); return; } int mid=t[o].mid(); down(o); if(l<=mid)add(l,r,ls(o)); if(r>mid)add(l,r,rs(o)); up(o); } int getsum(int l,int r,int o=1){ if(l<=t[o].l&&t[o].r<=r){ return t[o].op; } int ans=0; int mid=t[o].mid(); down(o); if(l<=mid)ans+=getsum(l,r,ls(o)); if(r>mid)ans+=getsum(l,r,rs(o)); return ans; } signed main(){ IOS cin>>n; for (int i = 1; i <=n-1; ++i) { int x; cin>>x; g[x].push_back(i+1); } dfs(1,0); for (int i = 1; i <=n ; ++i) { int tmp; cin>>tmp; w[in[i]]=tmp; } int m; cin>>m; build(1,n,1); while(m--){ string s; int op; cin>>s>>op; int l=in[op],r=out[op]; if(s=="get"){ cout<<getsum(l,r,1)<<endl; }else{ add(l,r,1); } } return 0; }
|