#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include<string>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<climits>
#include<set>

#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
using namespace std;
typedef pair<int, int> pii;
typedef long long int ll;
typedef pair<ll,ll> pll;
int dx[4] = {1,0,0,-1};
int dy[4] = {0,1,-1,0};
#define MOD 1000000007
#define ARRAY_MAX 2005

const int INF = 1e9+7;


typedef struct union_find{
    
    vector<ll> pa;//親
    vector<ll> ra;//木の深さ
    vector<ll> siz;
    //n要素で初期化
    void init(ll n){
        pa.resize(n);
        ra.resize(n);
        siz.resize(n);
        for(ll i = 0;i < n;i++){
            pa[i] = i;/*各ノードに番号を振る,この時par[x]=xとなる時は木の根となる*/
            ra[i] = 0;/*各ノード自体の高さは0*/
            siz[i] = i;
        }
    }
    //木の根を求める
    ll find(ll x){
        if(pa[x] == x){
            return x;/*根ならそのノードの番号を返す*/
        }else{
            return pa[x] = find(pa[x]);/*根でないならさらにノードの根を探す*/
        }
    }

    //xとyの属する集合を併合する
    void unite(ll x,ll y){
        x = find(x);//xの根の番号を探す
        y = find(y);//yの根の番号を探す
        if(x == y){//一致すればつながっている
            return;
        }
        pa[y] = x;
        siz[x] += siz[y];
        /*if(ra[x] < ra[y]){//xの高さが低いなら高いほうにつなぐ、そして高さは大きい方(y)になる
            pa[x] = y;
            siz[y] += siz[x];
        }else{
            pa[y] = x;//yの高さが低いなら高いほうにつなぐ、そして高さは大きいほう(x)になる
            siz[x] += siz[y];
            if(ra[x] == ra[y]){//高さが一致しているなら併合の高さは1増える
                ra[x]++;
            }
        }*/
    }

    //xとyが同じ集合に属するか判定
    bool same(ll x,ll y){
        return find(x) == find(y);//同じ集合なら1、違うなら0が返る
    }
    ll size(ll x){
        x = find(x);
        return siz[x];
    }
}UF;


int main(){

    ll n,q;
    while(cin >> n >> q,n|q){

        UF tree;
        tree.init(n+10);
        vector<ll> query,parent(n+10,0);
        vector<bool> used(n+10,false);
        //1-indexで扱う
        for(int i = 2;i <= n;i++){//親を格納
            cin >> parent[i];
        }
        parent[1] = 0;
        used[1] = true;

        for(int i = 0;i < q;i++){

            char c;
            ll k;
            cin >> c >> k;
            if(c == 'Q'){
                query.push_back(k);
            }else{
                if(used[k] == false){//既にマークした頂点はマークしない
                    query.push_back(-k);//負数なら色を付けるクエリとみなす
                    used[k] = true;
                }
            }
        }
        for(ll i = 2;i <= n;i++){
            if(used[i] == false){//色を付けないノードは先につなげておく
                tree.unite(parent[i],i);
            }
        }
        reverse(query.begin(),query.end());
        //クエリ逆順に見る
        ll sum = 0;
        ll q_siz = query.size();

        for(ll i = 0;i < q_siz;i++){
            if(query[i] < 0){
                tree.unite(parent[-query[i]],-query[i]);
            }else{
                sum += (ll)tree.find(query[i]);
            }
        }
        cout << sum << endl;
        query.shrink_to_fit();
        parent.shrink_to_fit();
        used.shrink_to_fit();
    }
    return 0;
}


Measured memory_bytes: 7596