int c[2d5],a[],b[],u; graph g; void f(int i,int p){ a[i]=u++; rep[g.edge[i]](j,g.es[i]){ if(j!=p){ f(j,i); } } b[i]=u; } { int@n,@q; rd(c(n),(a,b)(n-1)); g.setEdge(n+1,n-1,a,b); f(1,1); assert(u==n); segtree_Point_Xort; t.walloc(u); t.setN(u,0,0); rep(i,n)t[a[i+1]]=c[i]; t.build(); rep(q){ int@z,@x,@y; if(z==1){ t.change(a[x],t[a[x]]^y); } if(z==2){ wt(t.getXor(a[x],b[x])); } } }