rt,提交记录
#include<bits/stdc++.h>
using namespace std;
int n,m,a[2000005],siz[2000005],fa[2000005],g[2000005];
//vector<int>G[2000005];
map<int,list<int>>C[2000005];
int find(int x) {
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
x=find(x),y=find(y);
fa[y]=x;
siz[x]+=siz[y];
}
//void dfs(int u,int ff){
// for(int i=0;i<G[u].size();i++){
// int v=G[u][i];
// if(v==ff)continue;
// g[v]=u;
// if (a[v]==a[u])merge(u,v);
// else C[find(u)][a[v]].push_back(v);
// dfs(v,u);
// }
//}
void mg(int x,int y){
if (C[x].size()<C[y].size())swap(C[x],C[y]);
for (auto i:C[y])C[x][i.first].splice(C[x][i.first].end(),i.second);
C[y].clear();
}
int main(){
cin>>n>>m;
for(int i=2;i<=n;i++)cin>>g[i];
for(int i=1;i<=n;i++){
cin>>a[i];
siz[i]=1,fa[i]=i;
}
for(int i=2;i<=n;i++){
if(a[i]==a[g[i]])merge(g[i],i);
else C[find(g[i])][a[i]].push_back(i);
}
while(m--){
int op,x;cin>>op>>x;
x=find(x);
if(op==1){
int y;cin>>y;
if(a[x]==y) continue;
for(int i:C[x][y]) if(y==a[i]&&x!=find(i))merge(x,i),mg(x,i);
int z=find(g[x]);
if(a[z]==y)merge(z,x),mg(z,x);
else if(z) C[z][y].push_back(x);
a[find(x)]=y;
C[find(x)][y].clear();
}
else cout<<siz[x]<<endl;
}
return 0;
}
验证码 wccb 祭