J - Association of Cats and Magical Lights (树状数组+dfs序)

    科技2022-07-13  151

    #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; }

     

    Processed: 0.009, SQL: 8