#include #define endl '\n' using namespace std; const int MAXN = 20000 + 2; int n, q; int x[MAXN]; vector G[MAXN]; bool used[MAXN]; int dfs(int s) { int ret = 0; stack st; st.push(s); while (!st.empty()) { s = st.top(); st.pop(); if (used[s]) continue; used[s] = 1; ret ^= x[s]; for (int i = 0; i < G[s].size(); i++) { st.push(G[s][i]); } used[s] = 0; } return ret; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); freopen("xor.in", "r", stdin); freopen("xor.out", "w", stdout); cin >> n >> q; for (int i = 1; i <= n; i++) cin >> x[i]; for (int i = 1; i <= n-1; i++) { int a, b; cin >> a >> b; G[b].push_back(a); } for (int i = 1; i <= q; i++) { int type, node; cin >> type >> node; if (type == 2) { // memset(used, 0, sizeof(used)); cout << dfs(node) << endl; } else { int value; cin >> value; x[node] = value; } } return 0; } /** 4 3 1 2 4 8 1 2 2 3 3 4 2 4 1 2 5 2 3 */