可能是 int 和 long long 的问题?
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, q;
int fa[400005], dep[400005], dfn[400005], rdfn[400005], siz[400005], tot;
long long a[400005], tr[2000005], tg[2000005];
vector<int> G[400005];
void dfs(int u, int fa){
dep[u] = dep[fa] + 1;
++tot;
dfn[u] = tot;
rdfn[tot] = u;
siz[u] = 1;
for (auto v : G[u]){
if (v != fa){
dfs(v, u);
siz[u] += siz[v];
}
}
}
void pup(int u){
tr[u] = tr[u << 1] | tr[u << 1 | 1];
}
void build(int u, int l, int r){
if (l == r){
tr[u] = a[rdfn[l]];
return;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pup(u);
}
void pdn(int u){
if (!tg[u])
return;
tr[u << 1] = tg[u];
tr[u << 1 | 1] = tg[u];
tg[u << 1] = tg[u];
tg[u << 1 | 1] = tg[u];
tg[u] = 0;
}
void upd(int u, int l, int r, int L, int R, int x){
if (r < L || l > R)
return;
if (L <= l && r <= R){
tg[u] = x;
tr[u] = x;
return;
}
pdn(u);
int mid = (l + r) >> 1;
upd(u << 1, l, mid, L, R, x);
upd(u << 1 | 1, mid + 1, r, L, R, x);
pup(u);
}
long long qry(int u, int l, int r, int L, int R){
if (r < L || l > R)
return 0;
pdn(u);
if (L <= l && r <= R)
return tr[u];
int mid = (l + r) >> 1;
return qry(u << 1, l, mid, L, R) | qry(u << 1 | 1, mid + 1, r, L, R);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++){
cin >> a[i];
a[i] = 1ll << a[i] - 1;
}
for (int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1, 0);
build(1, 1, n);
// for (int i = 1; i <= n; i++)
// cout << i << " " << dfn[i] << " " << siz[i] << "\n";
while (q--){
// for (int i = 1; i <= n; i++)
// cout << qry(1, 1, n, i, i) << " ";
// cout << "\n";
int op, u;
cin >> op >> u;
if (op == 1){
int v;
cin >> v;
upd(1, 1, n, dfn[u], dfn[u] + siz[u] - 1, 1ll << v - 1);
}else
cout << __builtin_popcountll(qry(1, 1, n, dfn[u], dfn[u] + siz[u] - 1)) << "\n";
}
return 0;
}