#include #define MAXN 200002 #define int long long using namespace std; int n, q, val[MAXN], a, b, type, en[MAXN], timer, sz[MAXN], xors[MAXN], rev[MAXN], difXor[MAXN]; vector M[MAXN]; int tree[5 * MAXN]; void build_tree(int ind, int l, int r) { if(l == r) { tree[ind] = difXor[l]; //cout< r || curR < l) return 0; if(curL >= l && curR <= r) { //cout< indPoint || curR < indPoint) return; if(curL == indPoint && curR == indPoint) { tree[ind] ^= dif; return; } int mid = (curL + curR) / 2; if(mid >= indPoint) update(ind * 2 + 1, indPoint, curL, mid, dif); else update(ind * 2 + 2, indPoint, mid + 1, curR, dif); tree[ind] = tree[ind * 2 + 1] ^ tree[ind * 2 + 2]; } void upd(int v, int valV) { int dif = val[v] ^ valV; val[v] = valV; //cout<<"To be updated: "<>n>>q;// for(int i = 1; i <= n; i ++) { cin>>val[i]; } for(int i = 0; i < n - 1; i ++) { cin>>a>>b; M[a].push_back(b); M[b].push_back(a); } dfs(1, -1, val[1]); difArr(); build_tree(0, 0, n - 1); //upd(2, 5); while(q --) { cin>>type; if(type == 1) { cin>>a>>b; upd(a, b); } else { cin>>a; //cout<