#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

vector<int> e[100005];
int src[100005],cnt;
int lhs[100005],rhs[100005];

void dfs(int x){
    lhs[x]=cnt++;
    for(size_t i=0;i<e[x].size();i++)
        dfs(e[x][i]);
    rhs[x]=cnt;
}

class SegTree{
public:
    int ans[262144];
    int tag[262144];
    void clear(){
        memset(ans,0,sizeof(ans));
        memset(tag,0,sizeof(tag));
    }
    void modify(int l, int r, int x, int y, int i){
        if(l<=x && y<=r){
            tag[i]^=1;
            ans[i]=y-x-ans[i];
            return;
        }
        int m=(x+y)/2,j=i*2,k=j+1;
        if(l<m) modify(l,r,x,m,j);
        if(m<r) modify(l,r,m,y,k);
        ans[i]=ans[j]+ans[k];
        if(tag[i]) ans[i]=y-x-ans[i];
    }
    int getsum(int l, int r, int x, int y, int i, int v){
        if(l<=x && y<=r) return v?y-x-ans[i]:ans[i];
        int m=(x+y)/2,j=i*2,k=j+1,ret=0;
        if(l<m) ret+=getsum(l,r,x,m,j,v^tag[i]);
        if(m<r) ret+=getsum(l,r,m,y,k,v^tag[i]);
        return ret;
    }
}seg;

int main(){
    int n,m,x;
    while(scanf("%d%d",&n,&m)==2){
        cnt=0;
        seg.clear();
        for(int i=2;i<=n;i++){
            scanf("%d",src+i);
            e[src[i]].push_back(i);
        }
        dfs(1);
        for(int i=1;i<=n;i++) e[i].clear();
        for(int i=1;i<=m;i++){
            char s[10];
            scanf("%s%d",s,&x);
            if(*s=='o'){
                seg.modify(lhs[x],rhs[x],0,n,1);
            }else{
                int ret=seg.getsum(lhs[x],rhs[x],0,n,1,0);
                printf("%d\n",ret);
            }
        }
        puts("");
    }
}
