#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
struct node{
ll l,r,val,lazy;
}a[800000];
vector<ll> p[200001];
map<ll,ll> pre,suf,mp;
ll num,number[200001];
//dfs序:将非线性结构转换为线性结构
//pre[u]记录u点为根的子树区间的左端点
//suf[u]记录u点位根的子树区间的右端点
//整个遍历为前序遍历
//mp[num]记录遍历到u节点的顺序,可理解成映射
void dfs(ll u,ll fa){
pre[u]=++num;mp[num]=u;
for(ll i=0;i<p[u].size();i++){
dfs(p[u][i],u);
}
suf[u]=num;
return ;
}
void update(ll k){
a[k].val=a[k<<1].val+a[k<<1|1].val;
}
void pushdown(ll k){
if(a[k].lazy==0)return ;
if(a[k].l==a[k].r)return ;//判断叶子节点,否则超内存或数组越界
a[k<<1].lazy^=1;
a[k<<1|1].lazy^=1;
a[k<<1].val=a[k<<1].r-a[k<<1].l+1-a[k<<1].val;
a[k<<1|1].val=a[k<<1|1].r-a[k<<1|1].l+1-a[k<<1|1].val;
a[k].lazy=0;
return ;
}
void build(ll k,ll l,ll r){
a[k].r=r;
a[k].l=l;
a[k].lazy=0;
if(l==r){
a[k].val=number[mp[a[k].l]];
return ;
}
ll mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
update(k);
return ;
}
void change(ll k,ll l,ll r){
if(a[k].l>=l&&a[k].r<=r){
a[k].val=a[k].r-a[k].l+1-a[k].val;
a[k].lazy^=1;
return ;
}
ll mid=(a[k].l+a[k].r)>>1;
pushdown(k);
if(l<=mid){
change(k<<1,l,r);
}
if(r>mid){
change(k<<1|1,l,r);
}
update(k);
return ;
}
ll query(ll k,ll l,ll r){
pushdown(k);
if(a[k].l>=l&&a[k].r<=r){
return a[k].val;
}
ll mid=(a[k].l+a[k].r)>>1;
ll ans=0;
if(l<=mid)ans+=query(k<<1,l,r);
if(r>mid)ans+=query(k<<1|1,l,r);
return ans;
}
int main(){
ll n;
cin>>n;
ll x;
for(ll i=2;i<=n;i++){
cin>>x;
p[x].push_back(i);
}
for(ll i=1;i<=n;i++){
cin>>number[i];
}
dfs(1,-1);//求dfs序
build(1,1,n);//建树
ll m;
cin>>m;
while(m--){
string s;
ll y;
cin>>s>>y;
if(s=="get"){
cout<<query(1,pre[y],suf[y])<<endl;
}
else {
change(1,pre[y],suf[y]);
}
}
return 0;
}