#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <map>#include <queue>#include <set>#include <stack>#include <cmath>#include <ctime>using namespace std;#define N 100005#define lson l,mid,p<<1#define rson mid+1,r,p<<1|1#define demid int mid=(l+r)>>1int segt[N<<2],col[N<<2],n,m;vector<int>tr[N];int a[N],cnt,pre[N],hash[N];int dfs(int u){ int Min=1<<29; for(int i=0;i<tr[u].size();i++){ int v=tr[u][i]; Min=min(Min,dfs(v)); } ++cnt; Min=min(Min,cnt); a[cnt]=u; pre[cnt]=Min; hash[u]=cnt; return Min;}void settree(){ for(int i=1;i<=n;i++) tr[i].clear(); for(int i=2;i<=n;i++){ int u; scanf("%d",&u); tr[u].push_back(i); } cnt=0; dfs(1); memset(segt,0,sizeof(segt)); memset(col,0,sizeof(col));}void pushdown(int l,int r,int p){ if(col[p]){ demid; int nl=mid-l+1,nr=r-mid; segt[p<<1]=nl-segt[p<<1]; segt[p<<1|1]=nr-segt[p<<1|1]; col[p<<1]=(!col[p<<1]); col[p<<1|1]=(!col[p<<1|1]); } col[p]=0;}void pushup(int p){ segt[p]=segt[p<<1]+segt[p<<1|1];}void update(int L,int R,int l,int r,int p){ if(L<=l && r<=R){ int num=r-l+1; segt[p]=num-segt[p]; col[p]=(!col[p]); return; } pushdown(l,r,p); demid; if(L<=mid) update(L,R,lson); if(mid<R) update(L,R,rson); pushup(p);}int query(int L,int R,int l,int r,int p){ if(L<=l && r<=R){ return segt[p]; } pushdown(l,r,p); demid; int res=0; if(L<=mid) res+=query(L,R,lson); if(mid<R) res+=query(L,R,rson); return res;}int main(){ while(cin>>n>>m){ settree(); while(m--){ char key[5]; int u; scanf("%s%d",key,&u); if(key[0]=='o'){ int r=hash[u],l=pre[r]; update(l,r,1,n,1); } else{ int r=hash[u],l=pre[r]; printf("%dn",query(l,r,1,n,1)); } } puts(""); } return 0;}


