#include<set>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;

int n,q;
int to[N],nx[N],h[N],sz;
int dep[N][25];
int L[N],R[N],b[N],c[N];
int g[N],f[N],t[N];
set<int> s[N];
set<int>::iterator it;

int lowbit(int x)
{
return x&-x;
}

void update(int p,int v)
{
for(int i=p;i<=n;i=i+lowbit(i)) c[i]+=v;
}

int sum(int p)
{
int res=0;
for(int i=p;i>0;i=i-lowbit(i)) res=res+c[i];
return res;
}

void add(int u,int v)
{
to[sz]=v;
nx[sz]=h[u];
h[u]=sz++;
}

void dfs(int x)
{
sz++; L[x]=sz; t[x]=0;
for(int i=h[x];i!=-1;i=nx[i]){
if(x==1) b[to[i]]=to[i];
else b[to[i]]=b[x];
dfs(to[i]);
t[x]+=t[to[i]];
}
if (!t[x]) t[x]=1;
R[x]=sz;
}

int Count(int x)
{
return sum(R[x])-sum(L[x]-1);
}

int query(int x,int y)
{
if (Count(x)==y) return t[x];
int res=x;
for (int i=20;i>=0;i--)
{
if (dep[x][i]<=1) continue;
if (Count(dep[x][i])<y) x=dep[x][i];
else res=dep[x][i];
}
return t[res];
}

int main()
{
freopen("gangsters.in","r",stdin);
freopen("gangsters.out","w",stdout);
while(~scanf("%d%d",&n,&q))
{
sz=0;
for(int i=1;i<=n;i++) h[i]=-1,g[i]=0,s[i].clear(),f[i]=0;

for(int i=2;i<=n;i++)
{
int x; scanf("%d",&x);
add(x,i);
dep[i][0]=x;
for(int j=1;j<=20;j++)
dep[i][j]=dep[dep[i][j-1]][j-1];
}

sz=0;
dfs(1);

int a1=0,a2=0,a3=0;
for(int i=1;i<=q;i++)
{
char op[5]; int x;
scanf("%s%d",op,&x);
if(op[0]=='+')
{
a3++;
s[b[x]].insert(x);
update(L[x],1);
a2-=f[b[x]];
if (!g[b[x]]++) a1++;
f[b[x]]=query(x,g[b[x]]);
a2+=f[b[x]];
}
else
{
a3--;
s[b[x]].erase(x);
update(L[x],-1);
a2-=f[b[x]];
if (!(--g[b[x]]))
{
a1--; f[b[x]]=0;
}
else {
it=s[b[x]].begin();
f[b[x]]=query(*it,g[b[x]]);
}
a2+=f[b[x]];
}
printf("%d %d\n",a1,a2-a3);
}
}
return 0;
}