//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define file "o"
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
//#define pb push_back
#define pb emplace_back
#define fi first
#define se second
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
const int mod=1e9+7;
const int maxn=1e6+15;
const ll inf=1e17;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll ran(ll l, ll r)
{
return uniform_int_distribution<ll> (l, r)(rng);
}
inline void rf(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen(file".inp","r")){
freopen(file".inp","r",stdin); freopen(file".out","w",stdout);
}
}
template<typename T> inline void add(T &x, const T &y)
{
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
template<typename T> inline bool maxi(T &a, T b)
{
if(a>=b) return 0;
a=b; return 1;
}
template<typename T> inline bool mini(T &a, T b)
{
if(a<=b) return 0;
a=b; return 1;
}
int main(){
rf();
int T; cin>>T;
int n,q; cin>>n>>q;
vector<int> p(n+1);
p[1]=0;
for(int i=2;i<=n;i++) cin>>p[i];
vector<vector<int>> ch(n+1);
for(int i=2;i<=n;i++) ch[p[i]].push_back(i);
vector<int> order;
order.reserve(n);
order.push_back(1);
for(size_t i=0;i<order.size();i++){
int u=order[i];
for(int v:ch[u]) order.push_back(v);
}
vector<int> sz(n+1,1);
for(int i=n-1;i>=0;i--){
int u=order[i];
for(int v:ch[u]) sz[u]+=sz[v];
}
vector<char> act(n+1,0);
vector<int> active_child_cnt(n+1,0);
vector<ll> sum_sz_active_children(n+1,0);
ll active_count=0;
ll edges_active=0;
ll total_sz_sum=0;
while(q--){
char op;
int v;
cin>>op>>v;
if(op=='+'){
act[v]=1;
active_count++;
active_child_cnt[p[v]]++;
sum_sz_active_children[p[v]] += sz[v];
if(act[p[v]]) edges_active++;
edges_active += active_child_cnt[v];
if(!act[p[v]]) total_sz_sum += sz[v];
total_sz_sum -= sum_sz_active_children[v];
} else {
act[v]=0;
active_count--;
active_child_cnt[p[v]]--;
sum_sz_active_children[p[v]] -= sz[v];
if(act[p[v]]) edges_active--;
edges_active -= active_child_cnt[v];
if(!act[p[v]]) total_sz_sum -= sz[v];
total_sz_sum += sum_sz_active_children[v];
}
ll comp = active_count - edges_active;
ll isolated = total_sz_sum - active_count;
cout<<comp<<" "<<isolated<<"\n";
}
return 0;
}