#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int>tree[400005];
int tag[2200005];
int y[2200005];
int x[400005];
int num[400005];
int start[400005];
int final[400005];
int top=0;
void dfs(int now,int father){
top++;
start[now]=top;
num[top]=now;
for(int i=0;i<tree[now].size();i++)if(tree[now][i]!=father)dfs(tree[now][i],now);
final[now]=top;
return;
}
void build(int now,int l,int r){
if(l==r){
y[now]=(1<<num[x[l]]);
return;
}
int mid=(l+r)/2;
build(now*2,l,mid);
build(now*2+1,mid+1,r);
y[now]=(y[now*2]|y[now*2+1]);
return;
}
void usetag(int now){
if(!tag[now])return;
y[now*2]=tag[now];
y[now*2+1]=tag[now];
tag[now*2]=tag[now];
tag[now*2+1]=tag[now];
tag[now]=0;
return;
}
void up(int now,int l,int r,int fl,int fr,int p){
if(l==fl&&r==fr){
y[now]=(1<<p);
tag[now]=y[now];
return;
}
usetag(now);
int mid=(l+r)/2;
if(fr<=mid)up(now*2,l,mid,fl,fr,p);
else if(fl>mid)up(now*2+1,mid+1,r,fl,fr,p);
else {
up(now*2,l,mid,fl,mid,p);
up(now*2+1,mid+1,r,mid+1,fr,p);
}
y[now]=(y[now*2]|y[now*2+1]);
return;
}
int down(int now,int l,int r,int fl,int fr){
if(l==fl&&r==fr)return y[now];
usetag(now);
int mid=(l+r)/2;
if(fr<=mid)return down(now*2,l,mid,fl,fr);
else if(fl>mid)return down(now*2+1,mid+1,r,fl,fr);
else return (down(now*2,l,mid,fl,mid)|down(now*2+1,mid+1,r,mid+1,fr));
}
signed main(){
int n,m;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&x[i]);
for(int i=1;i<n;i++){
int a,b;
scanf("%lld%lld",&a,&b);
tree[a].push_back(b);
tree[b].push_back(a);
}
dfs(1,1);
build(1,1,n);
while(m--){
int kind,u;
scanf("%lld%lld",&kind,&u);
if(kind==1){
int c;
scanf("%lld",&c);
up(1,1,n,start[u],final[u],c);
}
else{
int ans=down(1,1,n,start[u],final[u]),summ=0;
for(int i=1;i<=60;i++)if((ans&(1<<i)))summ++;
printf("%lld\n",summ/2);
}
}
return 0;
}