#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
using i64 = long long;
using f64 = long double;
using ui64 = unsigned long long;
using pII = pair<int,int>;
using pLL = pair<i64,i64>;
mt19937 rng32(time(0));
mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count());
int t,n,q,a[100009],b[100009],bb[100009][10],seg[500009][10],lazy[500009][10];
int ci,cp,sz[100009],head[100009],par[100009],pos[100009],rL[500009],rR[500009];
vector<int> adj[100009];
void buildrange(int node,int l,int r)
{
if(l==r) rL[node]=l,rR[node]=r;
else
{
buildrange(2*node,l,(l+r)/2);
buildrange(2*node+1,(l+r)/2+1,r);
rL[node]=rL[2*node];rR[node]=rR[2*node+1];
}
}
void build(int node,int l,int r,int8_t _b)
{
lazy[node][_b]=0;
if(l==r) seg[node][_b]=bb[l][_b];
else
{
build(2*node,l,(l+r)/2,_b);
build(2*node+1,(l+r)/2+1,r,_b);
seg[node][_b]=seg[2*node][_b]+seg[2*node+1][_b];
}
}
void down(int node,int8_t _b)
{
if(lazy[node][_b]&1)
{
seg[2*node][_b]=rR[2*node]-rL[2*node]+1-seg[2*node][_b];
seg[2*node+1][_b]=rR[2*node+1]-rL[2*node+1]+1-seg[2*node+1][_b];
}
lazy[2*node][_b]^=lazy[node][_b];
lazy[2*node+1][_b]^=lazy[node][_b];
lazy[node][_b]=0;
}
void update(int node,int tl,int tr,int l,int r,bool v,int8_t _b)
{
if(tr<l or r<tl) return;
if(l<=tl and tr<=r)
{
if(v&1) seg[node][_b]=rR[node]-rL[node]+1-seg[node][_b];
lazy[node][_b]^=v;
return;
}
down(node,_b);
update(2*node,tl,(tl+tr)/2,l,r,v,_b);
update(2*node+1,(tl+tr)/2+1,tr,l,r,v,_b);
seg[node][_b]=seg[2*node][_b]+seg[2*node+1][_b];
}
void real_update(int l,int r,int v){
for(short i=0;i<10;++i) update(1,1,n,l,r,(v>>i)&1,i);
}
int sum(int node,int tl,int tr,int l,int r,int8_t _b)
{
if(tr<l or r<tl) return 0;
if(l<=tl and tr<=r) return seg[node][_b];
down(node,_b);
return sum(2*node,tl,(tl+tr)/2,l,r,_b)+sum(2*node+1,(tl+tr)/2+1,tr,l,r,_b);
}
int real_sum(int l,int r){
int s=0;
for(short i=0;i<10;++i) s+=(1<<i)*sum(1,1,n,l,r,i);
return s;
}
void DFS(int u,int pu)
{
par[u]=pu; sz[u]=1;
for(int v:adj[u])
{
if(v!=pu)
{
DFS(v,u);
sz[u]+=sz[v];
}
}
}
void HLD(int u,int pu)
{
b[ci]=u;pos[u]=ci;++ci;
head[u]=b[cp];
int mx=-1;
for(int v:adj[u])
if(v!=pu and sz[v]>sz[mx]) mx=v;
if(mx<0) {cp=ci;return;}
HLD(mx,u);
for(int v:adj[u])
if(v!=mx and v!=pu) HLD(v,u);
}
int LCA(int u,int v)
{
while(head[u]!=head[v])
{
if(sz[head[u]]<sz[head[v]]) u=par[head[u]];
else v=par[head[v]];
}
return sz[u]>sz[v]?u:v;
}
void even_real_update(int u,int v,int val)
{
int L=LCA(u,v);
while(head[u]!=head[L])
{
real_update(pos[head[u]],pos[u],val);
u=par[head[u]];
}
while(head[v]!=head[L])
{
real_update(pos[head[v]],pos[v],val);
v=par[head[v]];
}
if(sz[u]>sz[v]) real_update(pos[u],pos[v],val);
else real_update(pos[v],pos[u],val);
}
int even_real_sum(int u,int v)
{
int L=LCA(u,v),res=0;
while(head[u]!=head[L])
{
res+=real_sum(pos[head[u]],pos[u]);
u=par[head[u]];
}
while(head[v]!=head[L])
{
res+=real_sum(pos[head[v]],pos[v]);
v=par[head[v]];
}
if(sz[u]>sz[v]) res+=real_sum(pos[u],pos[v]);
else res+=real_sum(pos[v],pos[u]);
return res;
}
void azarathmetrionzithos()
{
cin>>n; ci=cp=1;
for(int i=1;i<=n;++i)
{
cin>>a[i];
adj[i].clear();
adj[i].shrink_to_fit();
}
for(int u,v,i=1;i<n;++i)
{
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
adj[1].push_back(0);
DFS(1,0); sz[0]=1+sz[1];
HLD(1,0); buildrange(1,1,n);
for(int i=1;i<=n;++i)
for(int8_t j=0;j<10;++j) bb[i][j]=(a[b[i]]>>j)&1;
for(int8_t i=0;i<10;++i) build(1,1,n,i);
cin>>q;
for(int cmd,u,v,p;q>0;--q)
{
cin>>cmd;
if(cmd==1)
{
cin>>u>>v>>p;
even_real_update(u,v,p);
}
else
{
cin>>u>>v;
cout<<even_real_sum(u,v)<<'\n';
}
}
}
signed main()
{
if(fopen("XORTREE.INP","r"))
{
freopen("XORTREE.INP","r",stdin);
freopen("XORTREE.OUT","w",stdout);
}
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--) azarathmetrionzithos();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgaTY0ICA9IGxvbmcgbG9uZzsKdXNpbmcgZjY0ICA9IGxvbmcgZG91YmxlOwp1c2luZyB1aTY0ID0gdW5zaWduZWQgbG9uZyBsb25nOwp1c2luZyBwSUkgID0gcGFpcjxpbnQsaW50PjsKdXNpbmcgcExMICA9IHBhaXI8aTY0LGk2ND47Cm10MTk5Mzcgcm5nMzIodGltZSgwKSk7Cm10MTk5MzdfNjQgcm5nNjQoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKaW50IHQsbixxLGFbMTAwMDA5XSxiWzEwMDAwOV0sYmJbMTAwMDA5XVsxMF0sc2VnWzUwMDAwOV1bMTBdLGxhenlbNTAwMDA5XVsxMF07CmludCBjaSxjcCxzelsxMDAwMDldLGhlYWRbMTAwMDA5XSxwYXJbMTAwMDA5XSxwb3NbMTAwMDA5XSxyTFs1MDAwMDldLHJSWzUwMDAwOV07CnZlY3RvcjxpbnQ+IGFkalsxMDAwMDldOwp2b2lkIGJ1aWxkcmFuZ2UoaW50IG5vZGUsaW50IGwsaW50IHIpCnsKICAgIGlmKGw9PXIpIHJMW25vZGVdPWwsclJbbm9kZV09cjsKICAgIGVsc2UKICAgIHsKICAgICAgICBidWlsZHJhbmdlKDIqbm9kZSxsLChsK3IpLzIpOwogICAgICAgIGJ1aWxkcmFuZ2UoMipub2RlKzEsKGwrcikvMisxLHIpOwogICAgICAgIHJMW25vZGVdPXJMWzIqbm9kZV07clJbbm9kZV09clJbMipub2RlKzFdOwogICAgfQp9CnZvaWQgYnVpbGQoaW50IG5vZGUsaW50IGwsaW50IHIsaW50OF90IF9iKQp7CiAgICBsYXp5W25vZGVdW19iXT0wOwogICAgaWYobD09cikgc2VnW25vZGVdW19iXT1iYltsXVtfYl07CiAgICBlbHNlCiAgICB7CiAgICAgICAgYnVpbGQoMipub2RlLGwsKGwrcikvMixfYik7CiAgICAgICAgYnVpbGQoMipub2RlKzEsKGwrcikvMisxLHIsX2IpOwogICAgICAgIHNlZ1tub2RlXVtfYl09c2VnWzIqbm9kZV1bX2JdK3NlZ1syKm5vZGUrMV1bX2JdOwogICAgfQp9CnZvaWQgZG93bihpbnQgbm9kZSxpbnQ4X3QgX2IpCnsKICAgIGlmKGxhenlbbm9kZV1bX2JdJjEpCiAgICB7CiAgICAgICAgc2VnWzIqbm9kZV1bX2JdPXJSWzIqbm9kZV0tckxbMipub2RlXSsxLXNlZ1syKm5vZGVdW19iXTsKICAgICAgICBzZWdbMipub2RlKzFdW19iXT1yUlsyKm5vZGUrMV0tckxbMipub2RlKzFdKzEtc2VnWzIqbm9kZSsxXVtfYl07CiAgICB9CiAgICBsYXp5WzIqbm9kZV1bX2JdXj1sYXp5W25vZGVdW19iXTsKICAgIGxhenlbMipub2RlKzFdW19iXV49bGF6eVtub2RlXVtfYl07CiAgICBsYXp5W25vZGVdW19iXT0wOwp9CnZvaWQgdXBkYXRlKGludCBub2RlLGludCB0bCxpbnQgdHIsaW50IGwsaW50IHIsYm9vbCB2LGludDhfdCBfYikKewogICAgaWYodHI8bCBvciByPHRsKSByZXR1cm47CiAgICBpZihsPD10bCBhbmQgdHI8PXIpCiAgICB7CiAgICAgICAgaWYodiYxKSBzZWdbbm9kZV1bX2JdPXJSW25vZGVdLXJMW25vZGVdKzEtc2VnW25vZGVdW19iXTsKICAgICAgICBsYXp5W25vZGVdW19iXV49djsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBkb3duKG5vZGUsX2IpOwogICAgdXBkYXRlKDIqbm9kZSx0bCwodGwrdHIpLzIsbCxyLHYsX2IpOwogICAgdXBkYXRlKDIqbm9kZSsxLCh0bCt0cikvMisxLHRyLGwscix2LF9iKTsKICAgIHNlZ1tub2RlXVtfYl09c2VnWzIqbm9kZV1bX2JdK3NlZ1syKm5vZGUrMV1bX2JdOwp9CnZvaWQgcmVhbF91cGRhdGUoaW50IGwsaW50IHIsaW50IHYpewogICAgZm9yKHNob3J0IGk9MDtpPDEwOysraSkgdXBkYXRlKDEsMSxuLGwsciwodj4+aSkmMSxpKTsKfQppbnQgc3VtKGludCBub2RlLGludCB0bCxpbnQgdHIsaW50IGwsaW50IHIsaW50OF90IF9iKQp7CiAgICBpZih0cjxsIG9yIHI8dGwpIHJldHVybiAwOwogICAgaWYobDw9dGwgYW5kIHRyPD1yKSByZXR1cm4gc2VnW25vZGVdW19iXTsKICAgIGRvd24obm9kZSxfYik7CiAgICByZXR1cm4gc3VtKDIqbm9kZSx0bCwodGwrdHIpLzIsbCxyLF9iKStzdW0oMipub2RlKzEsKHRsK3RyKS8yKzEsdHIsbCxyLF9iKTsKfQppbnQgcmVhbF9zdW0oaW50IGwsaW50IHIpewogICAgaW50IHM9MDsKICAgIGZvcihzaG9ydCBpPTA7aTwxMDsrK2kpIHMrPSgxPDxpKSpzdW0oMSwxLG4sbCxyLGkpOwogICAgcmV0dXJuIHM7Cn0Kdm9pZCBERlMoaW50IHUsaW50IHB1KQp7CiAgICBwYXJbdV09cHU7IHN6W3VdPTE7CiAgICBmb3IoaW50IHY6YWRqW3VdKQogICAgewogICAgICAgIGlmKHYhPXB1KQogICAgICAgIHsKICAgICAgICAgICAgREZTKHYsdSk7CiAgICAgICAgICAgIHN6W3VdKz1zelt2XTsKICAgICAgICB9CiAgICB9Cn0Kdm9pZCBITEQoaW50IHUsaW50IHB1KQp7CiAgICBiW2NpXT11O3Bvc1t1XT1jaTsrK2NpOwogICAgaGVhZFt1XT1iW2NwXTsKICAgIGludCBteD0tMTsKICAgIGZvcihpbnQgdjphZGpbdV0pCiAgICAgICAgaWYodiE9cHUgYW5kIHN6W3ZdPnN6W214XSkgbXg9djsKICAgIGlmKG14PDApIHtjcD1jaTtyZXR1cm47fQogICAgSExEKG14LHUpOwogICAgZm9yKGludCB2OmFkalt1XSkKICAgICAgICBpZih2IT1teCBhbmQgdiE9cHUpIEhMRCh2LHUpOwp9CmludCBMQ0EoaW50IHUsaW50IHYpCnsKICAgIHdoaWxlKGhlYWRbdV0hPWhlYWRbdl0pCiAgICB7CiAgICAgICAgaWYoc3pbaGVhZFt1XV08c3pbaGVhZFt2XV0pIHU9cGFyW2hlYWRbdV1dOwogICAgICAgIGVsc2Ugdj1wYXJbaGVhZFt2XV07CiAgICB9CiAgICByZXR1cm4gc3pbdV0+c3pbdl0/dTp2Owp9CnZvaWQgZXZlbl9yZWFsX3VwZGF0ZShpbnQgdSxpbnQgdixpbnQgdmFsKQp7CiAgICBpbnQgTD1MQ0EodSx2KTsKICAgIHdoaWxlKGhlYWRbdV0hPWhlYWRbTF0pCiAgICB7CiAgICAgICAgcmVhbF91cGRhdGUocG9zW2hlYWRbdV1dLHBvc1t1XSx2YWwpOwogICAgICAgIHU9cGFyW2hlYWRbdV1dOwogICAgfQogICAgd2hpbGUoaGVhZFt2XSE9aGVhZFtMXSkKICAgIHsKICAgICAgICByZWFsX3VwZGF0ZShwb3NbaGVhZFt2XV0scG9zW3ZdLHZhbCk7CiAgICAgICAgdj1wYXJbaGVhZFt2XV07CiAgICB9CiAgICBpZihzelt1XT5zelt2XSkgcmVhbF91cGRhdGUocG9zW3VdLHBvc1t2XSx2YWwpOwogICAgZWxzZSByZWFsX3VwZGF0ZShwb3Nbdl0scG9zW3VdLHZhbCk7Cn0KaW50IGV2ZW5fcmVhbF9zdW0oaW50IHUsaW50IHYpCnsKICAgIGludCBMPUxDQSh1LHYpLHJlcz0wOwogICAgd2hpbGUoaGVhZFt1XSE9aGVhZFtMXSkKICAgIHsKICAgICAgICByZXMrPXJlYWxfc3VtKHBvc1toZWFkW3VdXSxwb3NbdV0pOwogICAgICAgIHU9cGFyW2hlYWRbdV1dOwogICAgfQogICAgd2hpbGUoaGVhZFt2XSE9aGVhZFtMXSkKICAgIHsKICAgICAgICByZXMrPXJlYWxfc3VtKHBvc1toZWFkW3ZdXSxwb3Nbdl0pOwogICAgICAgIHY9cGFyW2hlYWRbdl1dOwogICAgfQogICAgaWYoc3pbdV0+c3pbdl0pIHJlcys9cmVhbF9zdW0ocG9zW3VdLHBvc1t2XSk7CiAgICBlbHNlIHJlcys9cmVhbF9zdW0ocG9zW3ZdLHBvc1t1XSk7CiAgICByZXR1cm4gcmVzOwp9CnZvaWQgYXphcmF0aG1ldHJpb256aXRob3MoKQp7CiAgICBjaW4+Pm47IGNpPWNwPTE7CiAgICBmb3IoaW50IGk9MTtpPD1uOysraSkKICAgIHsKICAgICAgICBjaW4+PmFbaV07CiAgICAgICAgYWRqW2ldLmNsZWFyKCk7CiAgICAgICAgYWRqW2ldLnNocmlua190b19maXQoKTsKICAgIH0KICAgIGZvcihpbnQgdSx2LGk9MTtpPG47KytpKQogICAgewogICAgICAgIGNpbj4+dT4+djsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICBhZGpbMV0ucHVzaF9iYWNrKDApOwogICAgREZTKDEsMCk7IHN6WzBdPTErc3pbMV07CiAgICBITEQoMSwwKTsgYnVpbGRyYW5nZSgxLDEsbik7CiAgICBmb3IoaW50IGk9MTtpPD1uOysraSkKICAgICAgICBmb3IoaW50OF90IGo9MDtqPDEwOysraikgYmJbaV1bal09KGFbYltpXV0+PmopJjE7CiAgICBmb3IoaW50OF90IGk9MDtpPDEwOysraSkgYnVpbGQoMSwxLG4saSk7CiAgICBjaW4+PnE7CiAgICBmb3IoaW50IGNtZCx1LHYscDtxPjA7LS1xKQogICAgewogICAgICAgIGNpbj4+Y21kOwogICAgICAgIGlmKGNtZD09MSkKICAgICAgICB7CiAgICAgICAgICAgIGNpbj4+dT4+dj4+cDsKICAgICAgICAgICAgZXZlbl9yZWFsX3VwZGF0ZSh1LHYscCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNpbj4+dT4+djsKICAgICAgICAgICAgY291dDw8ZXZlbl9yZWFsX3N1bSh1LHYpPDwnXG4nOwogICAgICAgIH0KICAgIH0KfQpzaWduZWQgbWFpbigpCnsKICAgIGlmKGZvcGVuKCJYT1JUUkVFLklOUCIsInIiKSkKICAgIHsKICAgICAgICBmcmVvcGVuKCJYT1JUUkVFLklOUCIsInIiLHN0ZGluKTsKICAgICAgICBmcmVvcGVuKCJYT1JUUkVFLk9VVCIsInciLHN0ZG91dCk7CiAgICB9CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKICAgIGNpbj4+dDsKICAgIHdoaWxlKHQtLSkgYXphcmF0aG1ldHJpb256aXRob3MoKTsKfQo=