#include <bits/stdc++.h>
using namespace std;
int n,q,timer=0,a[400005],tin[400005],tout[400005],arr[800005],bit[67][800005];
vector <int> ve[400005];
void DFS(int u, int p)
{
    tin[u]=++timer;
    for (int v : ve[u]) if (v!=p) DFS(v,u);
    tout[u]=++timer;
}
void UPDATE(int id, int i, int v)
{
    while (i<=timer) bit[id][i]+=v,i+=i&(-i);
    return;
}
int GET(int id, int l, int r)
{
    l--;
    int resl=0,resr=0;
    while (l>0) resl+=bit[id][l],l-=l&(-l);
    while (r>0) resr+=bit[id][r],r-=r&(-r);
    return resr-resl;
}
signed main()
{
    ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>q;
    for (int i=1;i<=n;i++) cin>>a[i];
    for (int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        ve[u].push_back(v),ve[v].push_back(u);
    }
    DFS(1,0);
    for (int i=1;i<=n;i++) UPDATE(a[i],tin[i],1),UPDATE(a[i],tout[i],1);
    for (int i=1;i<=q;i++)
    {
        int t;
        cin>>t;
        if (t==1)
        {
            int u,c;
            cin>>u>>c;
            UPDATE(a[u],tin[u],-1),UPDATE(a[u],tout[u],-1);
            a[u]=c,UPDATE(c,tin[u],1),UPDATE(c,tout[u],1);
        }
        else
        {
            int pa,ans=0;
            cin>>pa;
            for (int i=1;i<=60;i++) if (GET(i,tin[pa],tout[pa])>0) ans++;
            cout<<ans<<'\n';
        }
    }
    return 0;
}