#include <bits/stdc++.h>
using namespace std;
int n,m,tid[400009],rk[400009],f[400009],sz[400009];
vector <int> g[400009];
bitset<69> tmp;
struct node
{
bitset<69> at;
bitset<69> x;
}a[1600009];
void build(int k,int l,int r)
{
a[k].at.reset();
if(l==r)
{
a[k].x.set(f[rk[l]]);
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
a[k].x=(a[k<<1].x|a[k<<1|1].x);
}
void pushup(int k)
{
a[k].x=(a[k<<1].x|a[k<<1|1].x);
}
void upd(int k,bitset<69> d)
{
a[k].x.reset();
a[k].at.reset();
a[k].x|=d;
a[k].at|=d;
}
void pushdown(int k)
{
if(a[k].at==0) return ;
upd(k<<1,a[k].at);
upd(k<<1|1,a[k].at);
}
void add(int k,int l,int r,int x,int y,int d)
{
if(y<l||r<x) return ;
if(x<=l&&r<=y)
{
upd(k,pow(2,d));
return ;
}
int mid=(l+r)/2;
pushdown(x);
if(x<=mid) add(k<<1,l,mid,x,y,d);
if(y>mid) add(k<<1|1,mid+1,r,x,y,d);
pushup(k);
}
bitset<69> ask(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return a[k].x;
int mid=(l+r)/2;
pushdown(x);
bitset<69> ans;
if(x<=mid) ans|=ask(k<<1,l,mid,x,y);
if(y>mid) ans|=ask(k<<1|1,mid+1,r,x,y);
return ans;
}
void dfs(int x,int fa)
{
sz[x]=1;
tid[x]=++tid[0];
rk[tid[0]]=x;
for(int i:g[x])
{
if(i==fa) continue ;
dfs(i,x);
sz[x]+=sz[i];
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>f[i];
}
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1,0);
build(1,1,n);
tmp.reset();
while(m--)
{
int x,y,op;
cin>>op>>x;
if(op==1)
{
cin>>y;
add(1,1,n,tid[x],tid[x]+sz[x]-1,y);
}
else cout<<ask(1,1,n,tid[x],tid[x]+sz[x]-1).count()<<'\n';
}
return 0;
}