#include<bits/stdc++.h>
using namespace std;
const int N=3e5+100;
int color[N];
vector<int> v[N];
int b[N][110];
int start[N],ed[N];
int cnt;
int n,q;
void dfs(int x){
start[x]=++cnt;
for(int i=0;i<v[x].size();i++){
dfs(v[x][i]);
}
ed[x]=cnt;
}
int lowbit(int x){
return x&-x;
}
void update(int s,int c,int v){
for(int i=s;i<=n;i+=lowbit(i)){
b[i][c]+=v;
}
}
int query(int s,int c){
int sum=0;
for(int i=s;i>=1;i-=lowbit(i)){
sum+=b[i][c];
}
return sum;
}
int main(){
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) scanf("%d",&color[i]);
for(int i=1;i<n;i++){
int x;scanf("%d",&x);
v[x].push_back(i+1);
}
dfs(1);
for(int i=1;i<=n;i++){
update(start[i],color[i],1);
}
while(q--){
int x,k;scanf("%d%d",&k,&x);
if(k==0){
int ans=0;
for(int i=1;i<=100;i++){
int sum=query(ed[x],i)-query(start[x]-1,i);
if(sum%2==1) ans++;
}
printf("%d\n",ans);
}
else{
update(start[x],color[x],-1);
update(start[x],k,1);
color[x]=k;
}
}
return 0;
}