// Slower C++ solution:
#include <iostream>

#include <vector>

#include <queue>

#include <stack>

using namespace std;



// 并?集相?数据与算法

#define MAX_N 100000 + 16

int parent[MAX_N];

int height[MAX_N];



void init(const int& n)

{

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

	{

		parent[i] = i;

		height[i] = 0;

	}

}



int find(const int& x)

{

	if (parent[x] == x)

	{

		return x;

	}

	else

	{

		return parent[x] = find(parent[x]);

	}

}



void unite(int x, int y)

{

	x = find(x);

	y = find(y);

	if (x == y)

	{

		return;

	}



	if (height[x] < height[y])

	{

		parent[x] = y;

	}

	else

	{

		parent[y] = x;

		if (height[x] == height[y])

		{

			++height[x];

		}

	}

}



bool same(const int& x, const int& y)

{

	return find(x) == find(y);

}

// End Of 并?集



// 原始的?用它来描述

vector<int> children[MAX_N];

int parent_tree[MAX_N];

bool marked[MAX_N];

int ancestor[MAX_N];

// ?条指令被拆分? 操作 + 目?

stack<char> operation;

stack<int>  target;



void bfs(int index, int the_ancestor)

{

	queue<int> q_index;

	queue<int> q_ancestor;

	q_index.push(index);

	q_ancestor.push(the_ancestor);

	while (!q_index.empty())

	{

		the_ancestor = q_ancestor.front(); q_ancestor.pop();

		index = q_index.front(); q_index.pop();

		if (marked[index] == true)

		{

			the_ancestor = index;

		}

		ancestor[index] = the_ancestor;

		for (vector<int>::iterator it = children[index].begin(); it != children[index].end(); ++it)

		{

			q_index.push(*it);

			q_ancestor.push(the_ancestor);

		}

	}

}



int main(int argc, char *argv[])

{



	int N, Q;

	while (cin >> N, cin >> Q, N)

	{

		for (int i = 0; i < N; ++i)

		{

			children[i].clear();

			marked[i] = false;

		}

		marked[0] = true;

		int p;

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

		{

			cin >> p; --p;

			parent_tree[i] = p;

			children[p].push_back(i);

		}

		for (int i = 0; i < Q; ++i)

		{

			char o;

			int t;

			cin >> o >> t; --t;

			if (o == 'M')

			{

				if (marked[t])

				{

					continue;

				}

				else

				{

					marked[t] = true;

				}

			}

			operation.push(o);

			target.push(t);

		}

		bfs(0, 0);

		init(N);

		for (int i = 0; i < N; ++i)

		{

			unite(i, ancestor[i]);

		}

		unsigned long long result = 0;

		while (!operation.empty())

		{

			char o = operation.top(); operation.pop();

			int t = target.top(); target.pop();

			if (o == 'Q')

			{

				result += ancestor[find(t)] + 1;	// ?目index从1?始

			}

			else

			{

				// ?行“反染色”操作，之后?个?点的祖先??其父?点的祖先

				int p = ancestor[find(parent_tree[t])];

				unite(t, parent_tree[t]);

				ancestor[find(t)] = p;

			}

		}

		cout << result << endl;

	}

	



	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 3.2320804752837224x):
/*

 ━━━━━?

 ┓┏┓┏┓┃μ'sic foever!!

 ┛┗┛┗┛┃＼○／

 ┓┏┓┏┓┃ /

 ┛┗┛┗┛┃ノ)

 ┓┏┓┏┓┃

 ┛┗┛┗┛┃

 ┓┏┓┏┓┃

 ┛┗┛┗┛┃

 ┓┏┓┏┓┃

 ┛┗┛┗┛┃

 ┓┏┓┏┓┃

 ┃┃┃┃┃┃

 ┻┻┻┻┻┻

 */

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <cmath>

#include <map>

#include <stack>

#include <vector>

using namespace std;

const int maxn=1e5+10;

bool vis[maxn];

int pre[maxn];

long long res;

bool flag;

int find(int x){

    int r = x;

    while(pre[r]!=r){

        if(!flag&&vis[pre[r]]){

            res += pre[r];

            flag = true;

            return -1;

        }

        r = pre[r];

    }

    return r;

}

void join(int a,int b){

    pre[b]=a;

}

int main(){

    int n,q,i,j,a,b;

    char op;

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

        res = 0;

        memset(vis, false, sizeof(vis));

        for(i=1;i<=n;i++){

            pre[i] = i;

        }

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

            scanf("%d",&a);

            join(a,i);

        }

        getchar();

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

            scanf("%c %d",&op,&a);

            if(op=='Q'){

                if(!vis[a]){

                    flag = false;

                    if(find(a)==-1){

                        

                    }else{

                        res += 1;

                    }

                }else{

                    res += a;

                }

            }else{

                vis[a] = true;

            }

            getchar();

        }

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

    }

    return 0;

}