#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
// ---- Lazy‐Segment‐Tree for range‐assign + range‐OR‐query/popcount ----
struct SegTree {
int n;
vector<ull> seg, lazy;
vector<bool> marked;
SegTree(int _n): n(_n) {
seg.assign(4*n, 0);
lazy.assign(4*n, 0);
marked.assign(4*n, false);
}
void push(int v, int l, int r) {
if (!marked[v]) return;
seg[v] = lazy[v];
if (l < r) {
for (int c : {v<<1, v<<1|1}) {
marked[c] = true;
lazy[c] = lazy[v];
}
}
marked[v] = false;
}
void build(int v, int l, int r, vector<ull> &flat) {
if (l == r) {
seg[v] = flat[l];
return;
}
int m = (l+r)>>1;
build(v<<1, l, m, flat);
build(v<<1|1, m+1, r, flat);
seg[v] = seg[v<<1] | seg[v<<1|1];
}
void upd(int v, int l, int r, int ql, int qr, ull mask) {
push(v,l,r);
if (qr < l || r < ql) return;
if (ql <= l && r <= qr) {
marked[v] = true;
lazy[v] = mask;
push(v,l,r);
return;
}
int m = (l+r)>>1;
upd(v<<1, l, m, ql, qr, mask);
upd(v<<1|1, m+1, r, ql, qr, mask);
seg[v] = seg[v<<1] | seg[v<<1|1];
}
ull qry(int v, int l, int r, int ql, int qr) {
push(v,l,r);
if (qr < l || r < ql) return 0ULL;
if (ql <= l && r <= qr) return seg[v];
int m = (l+r)>>1;
return qry(v<<1, l, m, ql, qr)
| qry(v<<1|1, m+1, r, ql, qr);
}
// wrappers:
void build(vector<ull> &flat) { build(1,1,n,flat); }
void update(int l, int r, ull mask) { upd(1,1,n,l,r,mask); }
int query_popcount(int l, int r) {
ull x = qry(1,1,n,l,r);
return __builtin_popcountll(x);
}
};
// ---- Euler Tour flattening ----
static const int MAXN = 400000;
vector<int> adj[MAXN+1];
int n, m;
int tin[MAXN+1], tout[MAXN+1];
ull arr_val[MAXN+1];
int timer = 0;
vector<ull> flat; // 1..n
void dfs(int u, int p) {
tin[u] = ++timer;
flat[timer] = arr_val[u];
for (int v: adj[u]) {
if (v == p) continue;
dfs(v,u);
}
tout[u] = timer;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
// read initial bitsets
for(int i = 1; i <= n; i++){
int c;
cin >> c;
arr_val[i] = (1ULL << c);
}
// read tree edges
for(int i = 0; i < n-1; i++){
int u,v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
// 1) Euler‐tour flatten
flat.assign(n+1, 0ULL);
dfs(1, 0);
// 2) Build lazy‐segtree on flat[1..n]
SegTree st(n);
st.build(flat);
// 3) Process m operations:
// Format (example):
// type=1: 1 u newColor (assign subtree u to mask=(1<<newColor))
// type=2: 2 u (query popcount over subtree u)
while(m--){
int type;
cin >> type;
if(type == 1){
int u, c;
cin >> u >> c;
ull mask = (1ULL << c);
st.update(tin[u], tout[u], mask);
} else {
int u;
cin >> u;
int ans = st.query_popcount(tin[u], tout[u]);
cout << ans << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwp1c2luZyB1bGwgPSB1bnNpZ25lZCBsb25nIGxvbmc7CgovLyAtLS0tIExhennigJBTZWdtZW504oCQVHJlZSBmb3IgcmFuZ2XigJBhc3NpZ24gKyByYW5nZeKAkE9S4oCQcXVlcnkvcG9wY291bnQgLS0tLQpzdHJ1Y3QgU2VnVHJlZSB7CiAgICBpbnQgbjsKICAgIHZlY3Rvcjx1bGw+IHNlZywgbGF6eTsKICAgIHZlY3Rvcjxib29sPiBtYXJrZWQ7CiAgICBTZWdUcmVlKGludCBfbik6IG4oX24pIHsKICAgICAgICBzZWcuYXNzaWduKDQqbiwgMCk7CiAgICAgICAgbGF6eS5hc3NpZ24oNCpuLCAwKTsKICAgICAgICBtYXJrZWQuYXNzaWduKDQqbiwgZmFsc2UpOwogICAgfQogICAgdm9pZCBwdXNoKGludCB2LCBpbnQgbCwgaW50IHIpIHsKICAgICAgICBpZiAoIW1hcmtlZFt2XSkgcmV0dXJuOwogICAgICAgIHNlZ1t2XSA9IGxhenlbdl07CiAgICAgICAgaWYgKGwgPCByKSB7CiAgICAgICAgICAgIGZvciAoaW50IGMgOiB7djw8MSwgdjw8MXwxfSkgewogICAgICAgICAgICAgICAgbWFya2VkW2NdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGxhenlbY10gICA9IGxhenlbdl07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbWFya2VkW3ZdID0gZmFsc2U7CiAgICB9CiAgICB2b2lkIGJ1aWxkKGludCB2LCBpbnQgbCwgaW50IHIsIHZlY3Rvcjx1bGw+ICZmbGF0KSB7CiAgICAgICAgaWYgKGwgPT0gcikgewogICAgICAgICAgICBzZWdbdl0gPSBmbGF0W2xdOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGludCBtID0gKGwrcik+PjE7CiAgICAgICAgYnVpbGQodjw8MSwgICBsLCBtLCBmbGF0KTsKICAgICAgICBidWlsZCh2PDwxfDEsIG0rMSwgciwgZmxhdCk7CiAgICAgICAgc2VnW3ZdID0gc2VnW3Y8PDFdIHwgc2VnW3Y8PDF8MV07CiAgICB9CiAgICB2b2lkIHVwZChpbnQgdiwgaW50IGwsIGludCByLCBpbnQgcWwsIGludCBxciwgdWxsIG1hc2spIHsKICAgICAgICBwdXNoKHYsbCxyKTsKICAgICAgICBpZiAocXIgPCBsIHx8IHIgPCBxbCkgcmV0dXJuOwogICAgICAgIGlmIChxbCA8PSBsICYmIHIgPD0gcXIpIHsKICAgICAgICAgICAgbWFya2VkW3ZdID0gdHJ1ZTsKICAgICAgICAgICAgbGF6eVt2XSAgID0gbWFzazsKICAgICAgICAgICAgcHVzaCh2LGwscik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaW50IG0gPSAobCtyKT4+MTsKICAgICAgICB1cGQodjw8MSwgICBsLCBtLCBxbCwgcXIsIG1hc2spOwogICAgICAgIHVwZCh2PDwxfDEsIG0rMSwgciwgcWwsIHFyLCBtYXNrKTsKICAgICAgICBzZWdbdl0gPSBzZWdbdjw8MV0gfCBzZWdbdjw8MXwxXTsKICAgIH0KICAgIHVsbCBxcnkoaW50IHYsIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIpIHsKICAgICAgICBwdXNoKHYsbCxyKTsKICAgICAgICBpZiAocXIgPCBsIHx8IHIgPCBxbCkgcmV0dXJuIDBVTEw7CiAgICAgICAgaWYgKHFsIDw9IGwgJiYgciA8PSBxcikgcmV0dXJuIHNlZ1t2XTsKICAgICAgICBpbnQgbSA9IChsK3IpPj4xOwogICAgICAgIHJldHVybiBxcnkodjw8MSwgICBsLCBtLCBxbCwgcXIpCiAgICAgICAgICAgICB8IHFyeSh2PDwxfDEsIG0rMSwgciwgcWwsIHFyKTsKICAgIH0KICAgIC8vIHdyYXBwZXJzOgogICAgdm9pZCBidWlsZCh2ZWN0b3I8dWxsPiAmZmxhdCkgeyBidWlsZCgxLDEsbixmbGF0KTsgfQogICAgdm9pZCB1cGRhdGUoaW50IGwsIGludCByLCB1bGwgbWFzaykgeyB1cGQoMSwxLG4sbCxyLG1hc2spOyB9CiAgICBpbnQgcXVlcnlfcG9wY291bnQoaW50IGwsIGludCByKSB7CiAgICAgICAgdWxsIHggPSBxcnkoMSwxLG4sbCxyKTsKICAgICAgICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50bGwoeCk7CiAgICB9Cn07CgovLyAtLS0tIEV1bGVyIFRvdXIgZmxhdHRlbmluZyAtLS0tCnN0YXRpYyBjb25zdCBpbnQgTUFYTiA9IDQwMDAwMDsKdmVjdG9yPGludD4gYWRqW01BWE4rMV07CmludCBuLCBtOwppbnQgdGluW01BWE4rMV0sIHRvdXRbTUFYTisxXTsKdWxsIGFycl92YWxbTUFYTisxXTsKaW50IHRpbWVyID0gMDsKdmVjdG9yPHVsbD4gZmxhdDsgLy8gMS4ubgoKdm9pZCBkZnMoaW50IHUsIGludCBwKSB7CiAgICB0aW5bdV0gPSArK3RpbWVyOwogICAgZmxhdFt0aW1lcl0gPSBhcnJfdmFsW3VdOwogICAgZm9yIChpbnQgdjogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgPT0gcCkgY29udGludWU7CiAgICAgICAgZGZzKHYsdSk7CiAgICB9CiAgICB0b3V0W3VdID0gdGltZXI7Cn0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGNpbiA+PiBuID4+IG07CiAgICAvLyByZWFkIGluaXRpYWwgYml0c2V0cwogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgIGludCBjOyAKICAgICAgICBjaW4gPj4gYzsKICAgICAgICBhcnJfdmFsW2ldID0gKDFVTEwgPDwgYyk7CiAgICB9CiAgICAvLyByZWFkIHRyZWUgZWRnZXMKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuLTE7IGkrKyl7CiAgICAgICAgaW50IHUsdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KCiAgICAvLyAxKSBFdWxlcuKAkHRvdXIgZmxhdHRlbgogICAgZmxhdC5hc3NpZ24obisxLCAwVUxMKTsKICAgIGRmcygxLCAwKTsKCiAgICAvLyAyKSBCdWlsZCBsYXp54oCQc2VndHJlZSBvbiBmbGF0WzEuLm5dCiAgICBTZWdUcmVlIHN0KG4pOwogICAgc3QuYnVpbGQoZmxhdCk7CgogICAgLy8gMykgUHJvY2VzcyBtIG9wZXJhdGlvbnM6CiAgICAvLyAgICBGb3JtYXQgKGV4YW1wbGUpOiAKICAgIC8vICAgICAgdHlwZT0xOiAgIDEgdSBuZXdDb2xvciAgICAoYXNzaWduIHN1YnRyZWUgdSB0byBtYXNrPSgxPDxuZXdDb2xvcikpCiAgICAvLyAgICAgIHR5cGU9MjogICAyIHUgICAgICAgICAgICAgIChxdWVyeSBwb3Bjb3VudCBvdmVyIHN1YnRyZWUgdSkKICAgIHdoaWxlKG0tLSl7CiAgICAgICAgaW50IHR5cGU7IAogICAgICAgIGNpbiA+PiB0eXBlOwogICAgICAgIGlmKHR5cGUgPT0gMSl7CiAgICAgICAgICAgIGludCB1LCBjOwogICAgICAgICAgICBjaW4gPj4gdSA+PiBjOwogICAgICAgICAgICB1bGwgbWFzayA9ICgxVUxMIDw8IGMpOwogICAgICAgICAgICBzdC51cGRhdGUodGluW3VdLCB0b3V0W3VdLCBtYXNrKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgdTsgCiAgICAgICAgICAgIGNpbiA+PiB1OwogICAgICAgICAgICBpbnQgYW5zID0gc3QucXVlcnlfcG9wY291bnQodGluW3VdLCB0b3V0W3VdKTsKICAgICAgICAgICAgY291dCA8PCBhbnMgPDwgIlxuIjsKICAgICAgICB9CiAgICB9CiAgICAKICAgIAogICAgCiAgICByZXR1cm4gMDsKfQo=