#include<bits/stdc++.h>
using namespace std;
struct Edge{
int to,next;
}edge[2000010];
int head[1000010];
int cnt,n;
int flag[5000010],num[1000010],sum[5000010];
int deep[1000010],siz[1000010],son[1000010],fa[1000100],top[1000010];
void init(){
for(int i=0;i<2000010;i++){
edge[i].next=-1;
head[i]=-1;
}
cnt=0;
}
void push(int mid,int s,int t,int p){
flag[p<<1]=flag[p<<1|1]=flag[p];
if(flag[p]==0){
sum[p<<1]=sum[p<<1|1]=0;
}else{
sum[p<<1]=mid-s+1;
sum[p<<1|1]=t-mid;
}
flag[p]=-1;
}
int get(int l,int r,int s,int t,int p,int w){
int ans=sum[p];
if(l<=s&&t<=r){
flag[p]=w;
sum[p]=(t-s+1)*w;
return ans;
}
int mid=s+t>>1;
if(flag[p]>=0){
push(mid,s,t,p);
}
if(l<=mid){
ans+=get(l,r,s,mid,p<<1,w);
}
if(r>mid){
ans+=get(l,r,mid+1,t,p<<1|1,w);
}
sum[p]=sum[p<<1]+sum[p<<1|1];
return ans;
}
void addedge(int u,int v){
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int x,int f){
siz[x]=1;
for(int i=head[x];i;i=edge[i].next){
int y=edge[i].to;
if(y!=f){
fa[y]=x;
deep[y]=deep[x]+1;
dfs(y,x);
siz[x]+=siz[y];
if(siz[son[x]]<siz[y]){
son[x]=y;
}
}
}
}
void dfs2(int x,int topx){
top[x]=topx;
num[x]=++cnt;
if(son[x]){
dfs2(son[x],topx);
}
for(int i=head[x];i;i=edge[i].next){
int y=edge[i].to;
if(y!=fa[x]&&y!=son[x]){
dfs2(y,y);
}
}
}
int LCA(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]){
swap(x,y);
}
ans+=get(num[top[x]],num[x],1,n,1,1);
x=fa[top[x]];
}
if(deep[x]>deep[y]){
swap(x,y);
}
ans+=get(num[x],num[y],1,n,1,1);
return ans;
}
int main(){
init();
int n,x;
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n;
memset(flag,-1,sizeof(flag));
for(int i=1;i<n;i++){
cin>>x;
x++;
fa[i+1]=x;
addedge(x,i+1);
}
deep[1]=1;
dfs(1,-1);
dfs2(1,1);
int q;
cin>>q;
string s;
for(int i=1;i<=q;i++){
cin>>s>>x;
x++;
int ans;
if(s[0]=='i'){
ans=LCA(x,i);
ans=deep[x]-ans;
}else{
ans=get(num[x],num[x]+siz[x]-1,1,n,1,0);
}
cout<<ans<<endl;
}
return 0;
}