/*
10
0 1 2 1 3 0 0 3 2
10
Send 0
Send 3
Danger 2
Send 7
Send 5
Send 9
Danger 9
Send 4
Send 1
Send 9
1
3
2
1
3
1
1
1
0
1
#include <cstdio>
#include <cstring>
int s[5005];
int head[5005];
bool vis[5005];
struct Node{
int v;
int next;
}edge[10005];
int num;
void add_edge(int u,int v)//数组模拟邻接表。
{
edge[num].v = v;
edge[num].next = head[u];
head[u] = num ++ ;
}
int send(int count)//建立最少情报人员
{
int res = 0;
if(!vis[0])//0号 没有在通到内
{
vis[0] = true;
res ++ ;
}
while(!vis[num] && s[num]!=-1){
vis[num] = true;
res ++ ;
num = s[num];
}
return res;
}
int danger(int u)//撤离人员
{
int i;
int ans = 1;//自身算一个;
for(i=head[u];i!=-1;i=edge[i].next)
{
int v = edge[i].v;
if(vis[v])
{
vis[v] = false;
ans ++ ;
danger(v);
}
}
return ans;
}
int main()
{
int n,m,i;
num = 0;
scanf("%d",&n);
s[0] = -1;//0号上线是 -1;
memset(head,-1,sizeof(head));
memset(vis,false,sizeof(vis));
for(i=1;i<n;i++)
{
scanf("%d",&s[i]);
add_edge(s[i],i);
}
scanf("%d",&m);
while(m--){
char str[10];
int count;
scanf("%s",&str);
scanf("%d",&count);
if(str[0]=='S'){
printf("%d\n",send(count));
}
else if(str[0]=='D')
{
if(vis[count]){//输入的号已经在通道内
printf("0\n");
continue;
}
vis[count] = false;
printf("%d\n",danger(count));
}
}
return 0;
}