#include <bits/stdc++.h>
#define ll long long
#define double long double
#define endl "\n"
#define fi first
#define se second
#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define creby_ThienNhan return 0;
#define TKimorz ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
const int LimN=2e5+5;
const int N=1e5+5;
const int M=1e3+5;
const int BASE=256;
const int mod=1e9+7;
char d4c[4]={'R','D','L','U'};
ll d4x[4]={0,1,0,-1};
ll d4y[4]={1,0,-1,0};
ll d4x_tuong[4]={-2,-2,2,2};
ll d4y_tuong[4]={-2,2,-2,2};
ll d8x[8]={0,1,-1,0,-1,1,1,-1};
ll d8y[8]={1,0,0,-1,-1,1,-1,1};
ll d8x_ma[8]={-1,-1,+1,+1,-2,-2,+2,+2};
ll d8y_ma[8]={-2,+2,-2,+2,-1,+1,-1,+1};
template<class X, class Y>
bool maximize(X& x, const Y y) {
if (y > x) {x = y; return true;}
return false;
}
template<class X, class Y>
bool minimize(X& x, const Y y) {
if (y < x) {x = y; return true;}
return false;
}
ll pow(ll a,ll b,ll c){
ll tich = 1;
a = a % c;
for (; b > 0; b >>= 1 , a = a * a % c){
if (b & 1) tich = tich * a % c;
}
return tich;
}
ll n, q, cnt;
ll a[LimN];
ll head[LimN], p[LimN], heavy[LimN], h[LimN], pos[LimN],invpos[LimN];
vector<int> adj[LimN];
struct tn{
int cnt[10];
int lazy;
tn() {
memset(cnt,0,sizeof cnt);
lazy=0;
}
}st[LimN * 4];
int dfs(int u, int par) {
int cur_sz = 1, max_son_sz = 0;
for (int v : adj[u]) {
if (v == par) continue;
h[v] = h[u] + 1;
p[v] = u;
int son_sz = dfs(v, u);
if (son_sz > max_son_sz) {
max_son_sz = son_sz;
heavy[u] = v;
}
cur_sz += son_sz;
}
return cur_sz;
}
void hld(int u, int top) {
head[u] = top;
pos[u] = ++cnt;
invpos[cnt]=u;
if (heavy[u]) hld(heavy[u], top);
for (int v : adj[u]) {
if (v != p[u] && v != heavy[u]) {
hld(v, v);
}
}
}
void down(int id, int l, int r, int mask) {
int len=r-l+1;
for (int i=0; i<10; i++) {
if (BIT(mask,i)) {
st[id].cnt[i]=len-st[id].cnt[i];
}
}
st[id].lazy^=mask;
}
void push(int id, int l, int r) {
if (st[id].lazy) {
int mid=(l+r)/2;
down(id*2,l,mid,st[id].lazy);
down(id*2+1,mid+1,r,st[id].lazy);
st[id].lazy=0;
}
}
void build(int id, int l, int r) {
if (l==r) {
int val=a[invpos[l]];
for (int i=0; i<10; i++) {
st[id].cnt[i]= val >> i & 1;
}
return;
}
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
for (int i=0; i<10; i++) {
st[id].cnt[i]=st[id*2].cnt[i] + st[id*2+1].cnt[i];
}
}
void update(int id, int l, int r, int u, int v, int val) {
if (r < u || v < l) return;
if (u <= l && r <= v) {
down(id,l,r,val);
return;
}
push(id,l,r);
int mid = (l + r) / 2;
update(id * 2, l, mid, u, v, val);
update(id * 2 + 1, mid + 1, r, u, v, val);
for (int i=0; i<10; i++) {
st[id].cnt[i]=st[id*2].cnt[i] + st[id*2+1].cnt[i];
}
}
ll get(int id, int l, int r, int u, int v) {
if (r < u || l > v) return 0;
if (u <= l && r <= v) {
int ans=0;
for (int i=0; i<10; i++) {
ans+=st[id].cnt[i] * MASK(i);
}
return ans;
}
push(id,l,r);
int mid = l + r >> 1;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
void update_path(int x, int y, int val) {
while (head[x] != head[y]) {
if (h[head[x]] < h[head[y]]) swap(x, y);
update(1, 1, n, pos[head[x]], pos[x], val);
x = p[head[x]];
}
if (h[x] > h[y]) swap(x, y);
update(1, 1, n, pos[x], pos[y], val);
}
ll query(int x, int y) {
ll res = 0;
while (head[x] != head[y]) {
if (h[head[x]] < h[head[y]]) swap(x, y);
res += get(1, 1, n, pos[head[x]], pos[x]);
x = p[head[x]];
}
if (h[x] > h[y]) swap(x, y);
res += get(1, 1, n, pos[x], pos[y]);
return res;
}
void solve() {
int sub;
cin >> sub;
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i < n; ++i) {
int u, v; cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(1, 0);
hld(1, 1);
build(1,1,n);
cin >> q;
while (q--) {
int type; cin >> type;
if (type == 1) {
int x, y, v;
cin >> x >> y >> v;
update_path(x, y, v);
} else {
int x, y;
cin >> x >> y;
cout << query(x, y) << endl;
}
}
}
int main() {
TKimorz
ll t=1;
while (t--) {
solve();
}
creby_ThienNhan
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZG91YmxlIGxvbmcgZG91YmxlCiNkZWZpbmUgZW5kbCAiXG4iCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIEJJVCh4LCBpKSAoKCh4KSA+PiAoaSkpICYgMSkKI2RlZmluZSBjcmVieV9UaGllbk5oYW4gcmV0dXJuIDA7CiNkZWZpbmUgVEtpbW9yeiBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApLGNpbi50aWUoMCksY291dC50aWUoMCk7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBMaW1OPTJlNSs1Owpjb25zdCBpbnQgTj0xZTUrNTsKY29uc3QgaW50IE09MWUzKzU7CmNvbnN0IGludCBCQVNFPTI1NjsKY29uc3QgaW50IG1vZD0xZTkrNzsKY2hhciBkNGNbNF09eydSJywnRCcsJ0wnLCdVJ307CmxsIGQ0eFs0XT17MCwxLDAsLTF9OwpsbCBkNHlbNF09ezEsMCwtMSwwfTsKbGwgZDR4X3R1b25nWzRdPXstMiwtMiwyLDJ9OwpsbCBkNHlfdHVvbmdbNF09ey0yLDIsLTIsMn07CmxsIGQ4eFs4XT17MCwxLC0xLDAsLTEsMSwxLC0xfTsKbGwgZDh5WzhdPXsxLDAsMCwtMSwtMSwxLC0xLDF9OwpsbCBkOHhfbWFbOF09ey0xLC0xLCsxLCsxLC0yLC0yLCsyLCsyfTsKbGwgZDh5X21hWzhdPXstMiwrMiwtMiwrMiwtMSwrMSwtMSwrMX07CnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFk+CmJvb2wgbWF4aW1pemUoWCYgeCwgY29uc3QgWSB5KSB7CiAgICBpZiAoeSA+IHgpIHt4ID0geTsgcmV0dXJuIHRydWU7fQogICAgcmV0dXJuIGZhbHNlOwp9CnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFk+CmJvb2wgbWluaW1pemUoWCYgeCwgY29uc3QgWSB5KSB7CiAgICBpZiAoeSA8IHgpIHt4ID0geTsgcmV0dXJuIHRydWU7fQogICAgcmV0dXJuIGZhbHNlOwp9CmxsIHBvdyhsbCBhLGxsIGIsbGwgYyl7CiAgICBsbCB0aWNoID0gMTsKICAgIGEgPSBhICUgYzsKICAgIGZvciAoOyBiID4gMDsgYiA+Pj0gMSAsIGEgPSBhICogYSAlIGMpewogICAgICAgIGlmIChiICYgMSkgdGljaCA9IHRpY2ggKiBhICUgYzsKICAgICAgfQogICAgcmV0dXJuIHRpY2g7Cn0KbGwgbiwgcSwgY250OwpsbCBhW0xpbU5dOwpsbCBoZWFkW0xpbU5dLCBwW0xpbU5dLCBoZWF2eVtMaW1OXSwgaFtMaW1OXSwgcG9zW0xpbU5dLGludnBvc1tMaW1OXTsKdmVjdG9yPGludD4gYWRqW0xpbU5dOwpzdHJ1Y3QgdG57CiAgICBpbnQgY250WzEwXTsKICAgIGludCBsYXp5OwogICAgdG4oKSB7CiAgICAgICAgbWVtc2V0KGNudCwwLHNpemVvZiBjbnQpOwogICAgICAgIGxhenk9MDsKICAgIH0KfXN0W0xpbU4gKiA0XTsKaW50IGRmcyhpbnQgdSwgaW50IHBhcikgewogICAgaW50IGN1cl9zeiA9IDEsIG1heF9zb25fc3ogPSAwOwogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHBhcikgY29udGludWU7CiAgICAgICAgaFt2XSA9IGhbdV0gKyAxOwogICAgICAgIHBbdl0gPSB1OwogICAgICAgIGludCBzb25fc3ogPSBkZnModiwgdSk7CiAgICAgICAgaWYgKHNvbl9zeiA+IG1heF9zb25fc3opIHsKICAgICAgICAgICAgbWF4X3Nvbl9zeiA9IHNvbl9zejsKICAgICAgICAgICAgaGVhdnlbdV0gPSB2OwogICAgICAgIH0KICAgICAgICBjdXJfc3ogKz0gc29uX3N6OwogICAgfQogICAgcmV0dXJuIGN1cl9zejsKfQoKdm9pZCBobGQoaW50IHUsIGludCB0b3ApIHsKICAgIGhlYWRbdV0gPSB0b3A7CiAgICBwb3NbdV0gPSArK2NudDsKICAgIGludnBvc1tjbnRdPXU7CiAgICBpZiAoaGVhdnlbdV0pIGhsZChoZWF2eVt1XSwgdG9wKTsKICAgIGZvciAoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICBpZiAodiAhPSBwW3VdICYmIHYgIT0gaGVhdnlbdV0pIHsKICAgICAgICAgICAgaGxkKHYsIHYpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBkb3duKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgbWFzaykgewogICAgaW50IGxlbj1yLWwrMTsKICAgIGZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7CiAgICAgICAgaWYgKEJJVChtYXNrLGkpKSB7CiAgICAgICAgICAgIHN0W2lkXS5jbnRbaV09bGVuLXN0W2lkXS5jbnRbaV07CiAgICAgICAgfQogICAgfQogICAgc3RbaWRdLmxhenlePW1hc2s7Cn0Kdm9pZCBwdXNoKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBpZiAoc3RbaWRdLmxhenkpIHsKICAgICAgICBpbnQgbWlkPShsK3IpLzI7CiAgICAgICAgZG93bihpZCoyLGwsbWlkLHN0W2lkXS5sYXp5KTsKICAgICAgICBkb3duKGlkKjIrMSxtaWQrMSxyLHN0W2lkXS5sYXp5KTsKICAgICAgICBzdFtpZF0ubGF6eT0wOwogICAgfQp9CnZvaWQgYnVpbGQoaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmIChsPT1yKSB7CiAgICAgICAgaW50IHZhbD1hW2ludnBvc1tsXV07CiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwOyBpKyspIHsKICAgICAgICAgICAgc3RbaWRdLmNudFtpXT0gdmFsID4+IGkgJiAxOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkPShsK3IpLzI7CiAgICBidWlsZChpZCoyLGwsbWlkKTsKICAgIGJ1aWxkKGlkKjIrMSxtaWQrMSxyKTsKICAgIGZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7CiAgICAgICAgc3RbaWRdLmNudFtpXT1zdFtpZCoyXS5jbnRbaV0gKyBzdFtpZCoyKzFdLmNudFtpXTsKICAgIH0KfQoKdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IHZhbCkgewogICAgaWYgKHIgPCB1IHx8IHYgPCBsKSByZXR1cm47CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIGRvd24oaWQsbCxyLHZhbCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcHVzaChpZCxsLHIpOwogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgdXBkYXRlKGlkICogMiwgbCwgbWlkLCB1LCB2LCB2YWwpOwogICAgdXBkYXRlKGlkICogMiArIDEsIG1pZCArIDEsIHIsIHUsIHYsIHZhbCk7CiAgICBmb3IgKGludCBpPTA7IGk8MTA7IGkrKykgewogICAgICAgIHN0W2lkXS5jbnRbaV09c3RbaWQqMl0uY250W2ldICsgc3RbaWQqMisxXS5jbnRbaV07CiAgICB9Cn0KCmxsIGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICBpZiAociA8IHUgfHwgbCA+IHYpIHJldHVybiAwOwogICAgaWYgKHUgPD0gbCAmJiByIDw9IHYpIHsKICAgICAgICBpbnQgYW5zPTA7CiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwOyBpKyspIHsKICAgICAgICAgICAgYW5zKz1zdFtpZF0uY250W2ldICogTUFTSyhpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KICAgIHB1c2goaWQsbCxyKTsKICAgIGludCBtaWQgPSBsICsgciA+PiAxOwogICAgcmV0dXJuIGdldChpZCAqIDIsIGwsIG1pZCwgdSwgdikgKyBnZXQoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgdSwgdik7Cn0KCnZvaWQgdXBkYXRlX3BhdGgoaW50IHgsIGludCB5LCBpbnQgdmFsKSB7CiAgICB3aGlsZSAoaGVhZFt4XSAhPSBoZWFkW3ldKSB7CiAgICAgICAgaWYgKGhbaGVhZFt4XV0gPCBoW2hlYWRbeV1dKSBzd2FwKHgsIHkpOwogICAgICAgIHVwZGF0ZSgxLCAxLCBuLCBwb3NbaGVhZFt4XV0sIHBvc1t4XSwgdmFsKTsKICAgICAgICB4ID0gcFtoZWFkW3hdXTsKICAgIH0KICAgIGlmIChoW3hdID4gaFt5XSkgc3dhcCh4LCB5KTsKICAgIHVwZGF0ZSgxLCAxLCBuLCBwb3NbeF0sIHBvc1t5XSwgdmFsKTsKfQoKbGwgcXVlcnkoaW50IHgsIGludCB5KSB7CiAgICBsbCByZXMgPSAwOwogICAgd2hpbGUgKGhlYWRbeF0gIT0gaGVhZFt5XSkgewogICAgICAgIGlmIChoW2hlYWRbeF1dIDwgaFtoZWFkW3ldXSkgc3dhcCh4LCB5KTsKICAgICAgICByZXMgKz0gZ2V0KDEsIDEsIG4sIHBvc1toZWFkW3hdXSwgcG9zW3hdKTsKICAgICAgICB4ID0gcFtoZWFkW3hdXTsKICAgIH0KICAgIGlmIChoW3hdID4gaFt5XSkgc3dhcCh4LCB5KTsKICAgIHJlcyArPSBnZXQoMSwgMSwgbiwgcG9zW3hdLCBwb3NbeV0pOwogICAgcmV0dXJuIHJlczsKfQoKCnZvaWQgc29sdmUoKSB7CiAgICBpbnQgc3ViOwogICAgY2luID4+IHN1YjsKICAgIGNpbiA+PiBuOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSBjaW4gPj4gYVtpXTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaW50IHUsIHY7IGNpbiA+PiB1ID4+IHY7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgfQogICAgZGZzKDEsIDApOwogICAgaGxkKDEsIDEpOwogICAgYnVpbGQoMSwxLG4pOwogICAgY2luID4+IHE7CiAgICB3aGlsZSAocS0tKSB7CiAgICAgICAgaW50IHR5cGU7IGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IHgsIHksIHY7CiAgICAgICAgICAgIGNpbiA+PiB4ID4+IHkgPj4gdjsKICAgICAgICAgICAgdXBkYXRlX3BhdGgoeCwgeSwgdik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHgsIHk7CiAgICAgICAgICAgIGNpbiA+PiB4ID4+IHk7CiAgICAgICAgICAgIGNvdXQgPDwgcXVlcnkoeCwgeSkgPDwgZW5kbDsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgVEtpbW9yegogICAgbGwgdD0xOwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICBjcmVieV9UaGllbk5oYW4KfQo=