#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_N 100001
int par[MAX_N];
int rank[MAX_N];

struct operate{char op;int num;};

//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 par[x] = find(par[x]);
	}
}

//x????????????????????????????????????????\?????????¢???
int M_find(int x,int mark[]){
	if(mark[x]==1){
		return x;
	}else{
		return par[x] = M_find(par[x],mark);
	}
}

//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 i,n,num_q,p_node;
	int mark[MAX_N];
	struct operate ope;
	long long int sum=0;

	scanf("%d %d",&n,&num_q);
	init(n);

	for(i=1;i<=n;i++){
		mark[i]=0;
		scanf("%d",&p_node);
		unite(i,p_node);
	}
	ope.op='A'; ope.num=0; mark[1]=1;
	while(1){
		scanf("%c %d",&ope.op,&ope.num);
		if(ope.op=='0')break;
		if(ope.op=='Q')sum+=M_find(ope.num,mark);
		if(ope.op=='M')mark[ope.num]=1;
	}

	return 0;
}