#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define len(s) (int)s.size()
#define pb push_back
#define eb emplace_back
#define Fi first
#define Se second
#define MASK(x)  ((1LL)<<(x))
#define Bit(x,i) (((x)>>(i))&(1))
#define CountBit(x)  __builtin_popcountll(x)
#define ii pair<int,int>
#define OpenFile(Name) if (fopen(Name".inp","r")) freopen(Name".inp","r",stdin),freopen(Name".out","w",stdout);
using namespace std;

int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};

template <class C> bool Minimize(C &a, C b) { if (a>b) { a=b; return true; } return false;}
template <class C> bool Maximize(C &a, C b) { if (a<b) { a=b; return true; } return false;}

inline ll add(ll a,ll b,ll c) { return (a+b)%c; };
inline ll sub(ll a,ll b,ll c) { return (a-b+c)%c; };
inline ll mul(ll a,ll b,ll c) { return ((a%c)*(b%c))%c; };

ll K=1e18,MOD=1e9+7,MOD_base=1777777777;
const int N=1e5+5,M=1e3+3,base=31,BL=447;

///____________________________________________________________________________________________________________________________


int color[N],tin[N],tout[N],Node[N],cnt=0,dem[N];
vector<int> a[N];
int n;

void DFS(int u,int p=-1) {
    tin[u]=++cnt;
    Node[cnt]=u;

    for (int v:a[u])
    if (v!=p) DFS(v,u);

    tout[u]=cnt;
}

int check1(int l,int r) {
    int tmp=0,res=0;

    for (int i=l;i<=r;++i) {
        int u=Node[i];
        dem[color[u]]++;
        if (dem[color[u]]>tmp) {
            tmp=dem[color[u]];
            res=color[u];
        }
        //tmp=max(tmp,dem[color[u]]);
    }

    for (int i=l;i<=r;++i) dem[color[Node[i]]]=0;

    if (tmp>((r-l+1)/2)) return res;
    return -1;
}

bool vis[N];

int check2(int l,int r) {
    for (int i=l;i<=r;++i) vis[Node[i]]=1;

    int tmp=0,res=0,t=0;

    for (int i=1;i<=n;++i)
    if (!vis[Node[i]]) {
        int u=Node[i];
        dem[color[u]]++;
        if (dem[color[u]]>tmp) {
            tmp=dem[color[u]];
            res=color[u];
        }
        t++;
        //tmp=max(tmp,dem[color[u]]);
    }

    for (int i=l;i<=r;++i) dem[color[Node[i]]]=0;
    for (int i=l;i<=r;++i) vis[Node[i]]=0;

    //cout<<"truy van 2: "<<(r-l+1)/2<<' '<<tmp<<'\n';

    if (tmp>t/2) return res;
    return -1;
}

int b[N],d=0;

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    OpenFile("TQUERY");

    int q; cin>>n>>q;
    for (int i=1;i<=n;++i) cin>>color[i];

    for (int i=1;i<n;++i) {
        int u,v; cin>>u>>v;
        a[u].eb(v);
        a[v].eb(u);
    }

    DFS(1);

    //for (int i=1;i<=n;++i) cout<<i<<' '; cout<<'\n';
    //for (int i=1;i<=n;++i) cout<<Node[i]<<' '; cout<<'\n';
    //for (int i=1;i<=n;++i) cout<<tin[i]<<' '; cout<<'\n';
    //for (int i=1;i<=n;++i) cout<<tout[i]<<' '; cout<<'\n';


    while (q--) {
        int op,u; cin>>op>>u;

        //cout<<op<<' '<<u<<'\n';
        if (op==1) {
            int k=check1(tin[u],tout[u]);
            cout<<k<<'\n';
        } else
        if (op==2) {
            int k=check2(tin[u],tout[u]);
            cout<<k<<'\n';
        } else
        if (op==3) {
            int v; cin>>v;
            cout<<-1<<'\n';
        }
    }



    cerr<<"\nBien dich thanh cong\nTime: "<<(1.0*clock()/CLOCKS_PER_SEC)<<" s\n";
    return 0;
}
