#include<stdio.h>
#define MAX_N 100000
int par[MAX_N];
int rank[MAX_N];

//Union Find Tree?????????????????????
//????????¶?????§??????????????????????????§???
//?????¨??????????´???????????????????
void init(int n){
  int i;
  for(i=0;i<n;i++){
    par[i] = i;
    rank[i] = 0;
  }
}


//x?????????????´?????±??????????????????£??¨????????????
int find(int x){
  if(par[x]==x){
    return x;
  }else {
    return find(par[x]);
    return par[x] = find(par[x]);
  }
}

//x?????????????´?????±??????????????????£??¨????????????
int depth(int x){
  if(par[x]==x){
    return 0;
  }else {
    return depth(par[x])+1;
  }
}

//x,y????±?????????????????????¨??????
void unite(int x,int y){
  x =find(x);
  y =find(y);
  if(x==y){
    return ;
  }
  if(rank[x] < rank[y]){
    par[x] = y;
  }else {
    par[y] = x;
    if(rank[x] == rank[y])rank[x]++;
  }
}


//x,y????±?????????????????????????????????????
int same(int x,int y){
  return find(x)==find(y);
}


int main(){
  int N,Q;
  char s[16];
  int i,d;
  long long int res;
  while(1){
    if(!gets(s))break;
    sscanf(s,"%d %d",&N,&Q);
    if(N==0)break;
    res=0;
    init(N);
    for(i=1;i<N;i++){
      gets(s);
      sscanf(s,"%d",&par[i]);
      par[i]--;
    }
    for(i=0;i<Q;i++){
      gets(s);
      sscanf(s+2,"%d",&d);
      //printf(s);
      //return;
      switch(s[0]){
      case 'Q':
        res+=find(d-1)+1;
        //printf("%d\n",find(d-1)+1);
        break;
      case 'M':
        par[d-1]=d-1;
        //printf("%d\n",d-1);
        break;
      }
      //return 0;
    }
    //for(i=0;i<N;i++)printf("%d ",par[i]);
    printf("%lld\n",res);
  }
  return 0;
}