点击打开链接 提交地址
#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 ; }