// Slower C++ solution:
#include <stdio.h>

#include <stdlib.h>

#include <cmath>

#include <string.h>

#include <iostream>

#include<algorithm>

#include <queue>

#include <vector>

#include<string>

//******************************************************

#define lrt (rt*2)

#define rrt  (rt*2+1)

#define LL long long

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define exp 1e-8

const double temp=(1+sqrt(5))/2;

//***************************************************

#define eps             1e-8

#define inf             0x3f3f3f3f

#define INF             2e18

#define LL              long long

#define ULL             unsigned long long

#define PI              acos(-1.0)

#define pb              push_back

#define mk              make_pair



#define all(a)          a.begin(),a.end()

#define rall(a)         a.rbegin(),a.rend()

#define SQR(a)          ((a)*(a))

#define Unique(a)       sort(all(a)),a.erase(unique(all(a)),a.end())

#define min3(a,b,c)     min(a,min(b,c))

#define max3(a,b,c)     max(a,max(b,c))

#define min4(a,b,c,d)   min(min(a,b),min(c,d))

#define max4(a,b,c,d)   max(max(a,b),max(c,d))

#define max5(a,b,c,d,e) max(max3(a,b,c),max(d,e))

#define min5(a,b,c,d,e) min(min3(a,b,c),min(d,e))

#define Iterator(a)     __typeof__(a.begin())

#define rIterator(a)    __typeof__(a.rbegin())

#define FastRead        ios_base::sync_with_stdio(0);cin.tie(0)

#define CasePrint       pc('C'); pc('a'); pc('s'); pc('e'); pc(' '); write(qq++,false); pc(':'); pc(' ')

#define vi              vector <int>

#define vL              vector <LL>

#define For(I,A,B)      for(int I = (A); I < (B); ++I)

#define rFor(I,A,B)     for(int I = (A); I >= (B); --I)

#define Rep(I,N)        For(I,0,N)

using namespace std;

const int maxn=1e5+10;

int pre[maxn];

void iint()

{

    for(int i=0;i<maxn;i++) pre[i]=i;

}

int find(int x)

{

    return x==pre[x]?x:find(pre[x]);

}

void join(int x,int y)

{

    int fx=find(x),fy=find(y);

    if(fx!=fy)  pre[fx]=fy;

}

int main()

{

    int n,k,num;

    char str[5];

    while(cin>>n>>k)

    {

        LL sum=0;

        if(n+k==0)  break;

        iint();

        for(int i=2;i<=n;i++)

        {

            scanf("%d",&pre[i]);

        }

        while(k--)

        {

            scanf("%s%d",str,&num);

            if(str[0]=='M') pre[num]=num;

            else if(str[0]=='Q')    sum+=find(num);

        }

        cout<<sum<<endl;

    }

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.408344208674901x):
#include<bits/stdc++.h>

#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

typedef pair<int,int>P;

const int MAXN=100010;



int f[MAXN], mark[MAXN];

P Q[MAXN];



int getf(int k, int id)

{

	return mark[k] < id ? k : f[k] = getf(f[k], id);

	/*如果k?点被??的??早于????，就返回k。否?????k的父?点，

	且因???路径上有一些?点未被??或者???期，可以路径??,直接?被

	???点到最近???点路径上的所有?点都指向最近???点*/

}



int main()

{

	int n, q;

	while(~scanf("%d %d", &n, &q),n + q)

	{

		for(int i = 2; i <= n; i++)

		{

			scanf("%d", &f[i]);

			mark[i] = inf;

		}

		int cnt = 0;

		char c;

		int x;

		for(int i = 1; i <= q; i++)

		{

            getchar();

			scanf("%c %d", &c, &x);

			if(c == 'Q')

			Q[cnt++] = P(i, x);//P(i,x)表示在i?刻??x的最近??点

			else

			mark[x] = min(mark[x], i);//mark[i]表示i?点第一次被??的??，inf表示未被??

		}

		ll ans = 0;

		for(int i = cnt - 1; i >= 0; i--)

		ans += getf(Q[i].second, Q[i].first);

		printf("%lld\n", ans);

	}

 	return 0;

}