点击打开链接 提交地址
#include <iostream>
#include <string>
#include <string.h>
#include <math.h>
#include <cmath>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <algorithm>
#include <set>
using namespace std;
const int N = 300008 ;
struct E{
int v ;
int next ;
}e[N*2];
int egid ;
int g[N] ;
void add_edge(int u , int v){
e[egid].v = v ;
e[egid].next = g[u] ;
g[u] = egid++ ;
}
int leftId[N] , rightId[N] ;
int dfsTime ;
void dfs(int u , int fa){
leftId[u] = ++dfsTime ;
for(int i = g[u] ; i != -1 ; i = e[i].next){
int v = e[i].v ;
if(fa == v) continue ;
dfs(v , u) ;
}
rightId[u] = dfsTime ;
}
int n ;
int lowbit(int x){
return x & (-x) ;
}
typedef long long LL ;
LL val[2][N] ;
void add(int idx , LL c , int index){
for(; idx <= n ; idx += lowbit(idx)) val[index][idx] ^= c ;
}
LL sum(int idx , int index){
LL res = 0 ;
for(; idx >= 1 ; idx -= lowbit(idx)) res ^= val[index][idx] ;
return res ;
}
LL getSum(int l , int r , int index){
if(l > r) return 0 ;
return sum(r , index) ^ sum(l-1 , index) ;
}
void init(){
memset(g , -1 , sizeof(g)) ;
memset(val , 0 , sizeof(val)) ;
egid = 0 ;
dfsTime = 0 ;
}
int color[N] ;
void addColor(int idx , int c){
if(c < 50) add(idx , 1LL<<c , 0) ;
else add(idx , 1LL<<(c-50) , 1) ;
}
int countbitsize(LL x){
int sum = 0 ;
while(x){
if(x & 1) sum++ ;
x >>= 1 ;
}
return sum ;
}
int main(){
int q , u , k , x , res ;
while(scanf("%d%d" , &n , &q) != EOF){
init() ;
for(int i = 1 ; i <= n ; i++){
scanf("%d" , &color[i]) ;
color[i]-- ;
}
for(int i = 2 ; i <= n ; i++){
scanf("%d" , &u) ;
add_edge(u , i) ;
add_edge(i , u) ;
}
dfs(1 , -1) ;
for(int i = 1 ; i <= n ; i++){
addColor(leftId[i] , color[i]) ;
}
while(q--){
scanf("%d%d" , &k , &x) ;
if(k == 0){
if(x > n){
puts("0") ;
continue ;
}
LL a = getSum(leftId[x] , rightId[x] , 0) ;
LL b = getSum(leftId[x] , rightId[x] , 1) ;
res = countbitsize(a) + countbitsize(b) ;
printf("%d\n" , res) ;
}
else{
addColor(leftId[x] , color[x]) ;
color[x] = k - 1 ;
addColor(leftId[x] , color[x]) ;
}
}
}
return 0 ;
}