/*
codeforces 877E 线段树维护子树
Author: lcy
Time: 2017-11-2
一棵树,每个节点上有灯,每次可以操作
一颗子树,使其上面亮的灯熄灭,
灭的灯变亮。此外有一个查询操作,
返回每个子树中亮着的灯的个数。

先序遍历一遍树,重新标号,然后用线段树
维护每颗子树即可。

*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
#define pb(a) push_back(a)
const int MAXN=200005;
int mp[MAXN],tot;
int stn[MAXN*4],laz[MAXN*4];
int son[MAXN],fa[MAXN];
struct edge{
	int f,t;
};
vector<edge>e;
vector<int>g[MAXN];
inline void add_edge(int f,int t){
	e.push_back((edge){f,t});
	e.push_back((edge){t,f});
	g[f].push_back(e.size()-2);
	g[t].push_back(e.size()-1);
}
inline void push_down(int now,int l,int r){
	ll mid=(l+r)/2;
	if(laz[now]%2){
		stn[now<<1]=mid-l-stn[now<<1];	
		stn[(now<<1)+1]=r-mid-stn[(now<<1)+1];
	}	
	laz[now<<1]+=laz[now];	
	laz[(now<<1)+1]+=laz[now];	
	laz[now]=0;
}
void update(int now,int l,int r,int tl,int tr,int t){
	if(l>=tl&&r<=tr){
		laz[now]+=t;
		if(t%2)stn[now]=(r-l)-stn[now];
		return;
	}
	push_down(now,l,r);
	int mid=(l+r)/2;
	if(tl<mid)
		update(now<<1,l,mid,tl,tr,t);
	if(tr>mid)
		update((now<<1)+1,mid,r,tl,tr,t);
	stn[now]=stn[now<<1]+stn[(now<<1)+1];
}
int get(int now,int l,int r,int tl,int tr){
	if(l>=tl&&r<=tr){
		return stn[now];
	}
	push_down(now,l,r);
	int ans=0;
	int mid=(l+r)/2;
	if(tl<mid)
		ans+=get(now<<1,l,mid,tl,tr);
	if(tr>mid)
		ans+=get((now<<1)+1,mid,r,tl,tr);
	return ans;
}
void dfs(int x){
	mp[x]=++tot;
	son[x]=1;
	int sz=g[x].size();
	fr(i,0,sz-1){
		edge ne=e[g[x][i]];
		if(ne.t!=fa[x]){
			dfs(ne.t);
			son[x]+=son[ne.t];	
		}
	}	
}
int n;
int main(){
	int n;
	scfd(&n);
	fr(i,1,n-1){
		scanf("%d",&fa[i+1]);	
		add_edge(fa[i+1],i+1);
	}
	dfs(1);
	fr(i,1,n){
		int t;
		scfd(&t);
		if(t)update(1,1,n+1,mp[i],mp[i]+1,1);
	}
	int q;
	scfd(&q);
	char s[5];
	int t;
	while(q--){
		scanf("%s%d",s,&t);	
		if(!strcmp("get",s))
			printf("%d\n",get(1,1,n+1,mp[t],mp[t]+son[t]));	
		else
			update(1,1,n+1,mp[t],mp[t]+son[t],1);
	}
	return 0;
}



 posted on 2017-11-02 21:44  cylcy  阅读(651)  评论(0编辑  收藏  举报