#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define FOR(i,k,n) for ( int i = (k),_n=(n); i<=_n; i++)
#define FOD(i,k,n) for ( int i = (k),_n=(n); i>=_n; i--)
#define pb push_back
const int maxn =1e5+5;
ll chain=0,cnt=0;
vector<int>a[maxn];
ll wi[maxn],sz[maxn],pa[maxn],s[4*maxn],lz[4*maxn],pos[maxn],arr[maxn],h[maxn],head[maxn],id[maxn];
int n,t;
void buildt(int id, int l, int r){
if (l > r) return;
if (l == r) {
s[id] = wi[arr[l]];
return;
}
int mid = (l + r) / 2;
buildt(2 * id, l, mid);
buildt(2 * id + 1, mid + 1, r);
s[id] = s[2 * id] + s[2 * id + 1];
}
void pus(int id, int l, int r){
if (lz[id]){
s[id] += (r - l + 1) * lz[id];
if (l != r){
lz[2 * id] += lz[id];
lz[2 * id + 1] += lz[id];
}
lz[id] = 0;
}
}
void update(int id, int l, int r, int u, int v, ll w){
pus(id, l, r);
if (l > v || r < u) return;
if (l >= u && r <= v){
lz[id] += w;
pus(id, l, r);
return;
}
int mid = (l + r) / 2;
update(2 * id, l, mid, u, v, w);
update(2 * id + 1, mid + 1, r, u, v, w);
s[id] = s[2 * id] + s[2 * id + 1];
}
ll get(int id, int l, int r, int u, int v){
pus(id, l, r);
if (l > v || r < u) return 0;
if (l >= u && r <= v) return s[id];
int mid = (l + r) / 2;
return get(2 * id, l, mid, u, v) + get(2 * id + 1, mid + 1, r, u, v);
}
void dfs(int u, int p){
sz[u] = 1;
for (int v : a[u]) if (v != p){
pa[v] = u;
h[v] = h[u] + 1;
dfs(v, u);
sz[u] += sz[v];
}
}
void hld(int u, int p){
if (!head[chain]) head[chain] = u;
pos[u] = ++cnt;
id[u] = chain;
arr[cnt] = u;
int mx = 0;
for (int v : a[u]) if (v != p && sz[v] > sz[mx]) mx = v;
if (mx) hld(mx, u);
for (int v : a[u]) if (v != p && v != mx){
chain++;
hld(v, u);
}
}
void updhld(int u, int v, ll w){
while (id[u] != id[v]){
if (h[head[id[u]]] < h[head[id[v]]]) swap(u, v);
update(1, 1, n, pos[head[id[u]]], pos[u], w);
u = pa[head[id[u]]];
}
if (h[u] > h[v]) swap(u, v);
update(1, 1, n, pos[u], pos[v], w);
}
ll query(int u, int v){
ll res = 0;
while (id[u] != id[v]){
if (h[head[id[u]]] < h[head[id[v]]]) swap(u, v);
res += get(1, 1, n, pos[head[id[u]]], pos[u]);
u = pa[head[id[u]]];
}
if (h[u] > h[v]) swap(u, v);
res += get(1, 1, n, pos[u], pos[v]);
return res;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> t;
FOR(i, 1, n) cin >> wi[i];
FOR(i, 1, n - 1){
int u, v;
cin >> u >> v;
a[u].pb(v);
a[v].pb(u);
}
dfs(1, 1);
hld(1, 1);
buildt(1, 1, n);
while (t--){
int type;
cin >> type;
if (type == 1){
int u, v;
ll w;
cin >> u >> v >> w;
updhld(u, v, w);
} else {
int u, v;
cin >> u >> v;
cout << query(u, v) << endl;
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHBpaSBwYWlyPGludCxpbnQ+CiNkZWZpbmUgcGxsIHBhaXI8bGwsbGw+CiNkZWZpbmUgRk9SKGksayxuKSBmb3IgKCBpbnQgaSA9IChrKSxfbj0obik7IGk8PV9uOyBpKyspCiNkZWZpbmUgRk9EKGksayxuKSBmb3IgKCBpbnQgaSA9IChrKSxfbj0obik7IGk+PV9uOyBpLS0pCiNkZWZpbmUgcGIgcHVzaF9iYWNrCmNvbnN0IGludCBtYXhuID0xZTUrNTsKbGwgY2hhaW49MCxjbnQ9MDsKdmVjdG9yPGludD5hW21heG5dOwpsbCB3aVttYXhuXSxzelttYXhuXSxwYVttYXhuXSxzWzQqbWF4bl0sbHpbNCptYXhuXSxwb3NbbWF4bl0sYXJyW21heG5dLGhbbWF4bl0saGVhZFttYXhuXSxpZFttYXhuXTsKaW50IG4sdDsKCnZvaWQgYnVpbGR0KGludCBpZCwgaW50IGwsIGludCByKXsKICAgIGlmIChsID4gcikgcmV0dXJuOwogICAgaWYgKGwgPT0gcikgewogICAgICAgIHNbaWRdID0gd2lbYXJyW2xdXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICBidWlsZHQoMiAqIGlkLCBsLCBtaWQpOwogICAgYnVpbGR0KDIgKiBpZCArIDEsIG1pZCArIDEsIHIpOwogICAgc1tpZF0gPSBzWzIgKiBpZF0gKyBzWzIgKiBpZCArIDFdOwp9Cgp2b2lkIHB1cyhpbnQgaWQsIGludCBsLCBpbnQgcil7CiAgICBpZiAobHpbaWRdKXsKICAgICAgICBzW2lkXSArPSAociAtIGwgKyAxKSAqIGx6W2lkXTsKICAgICAgICBpZiAobCAhPSByKXsKICAgICAgICAgICAgbHpbMiAqIGlkXSArPSBseltpZF07CiAgICAgICAgICAgIGx6WzIgKiBpZCArIDFdICs9IGx6W2lkXTsKICAgICAgICB9CiAgICAgICAgbHpbaWRdID0gMDsKICAgIH0KfQoKdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgbGwgdyl7CiAgICBwdXMoaWQsIGwsIHIpOwogICAgaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm47CiAgICBpZiAobCA+PSB1ICYmIHIgPD0gdil7CiAgICAgICAgbHpbaWRdICs9IHc7CiAgICAgICAgcHVzKGlkLCBsLCByKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICB1cGRhdGUoMiAqIGlkLCBsLCBtaWQsIHUsIHYsIHcpOwogICAgdXBkYXRlKDIgKiBpZCArIDEsIG1pZCArIDEsIHIsIHUsIHYsIHcpOwogICAgc1tpZF0gPSBzWzIgKiBpZF0gKyBzWzIgKiBpZCArIDFdOwp9CgpsbCBnZXQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdil7CiAgICBwdXMoaWQsIGwsIHIpOwogICAgaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm4gMDsKICAgIGlmIChsID49IHUgJiYgciA8PSB2KSByZXR1cm4gc1tpZF07CiAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICByZXR1cm4gZ2V0KDIgKiBpZCwgbCwgbWlkLCB1LCB2KSArIGdldCgyICogaWQgKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsKfQoKdm9pZCBkZnMoaW50IHUsIGludCBwKXsKICAgIHN6W3VdID0gMTsKICAgIGZvciAoaW50IHYgOiBhW3VdKSBpZiAodiAhPSBwKXsKICAgICAgICBwYVt2XSA9IHU7CiAgICAgICAgaFt2XSA9IGhbdV0gKyAxOwogICAgICAgIGRmcyh2LCB1KTsKICAgICAgICBzelt1XSArPSBzelt2XTsKICAgIH0KfQoKdm9pZCBobGQoaW50IHUsIGludCBwKXsKICAgIGlmICghaGVhZFtjaGFpbl0pIGhlYWRbY2hhaW5dID0gdTsKICAgIHBvc1t1XSA9ICsrY250OwogICAgaWRbdV0gPSBjaGFpbjsKICAgIGFycltjbnRdID0gdTsKICAgIGludCBteCA9IDA7CiAgICBmb3IgKGludCB2IDogYVt1XSkgaWYgKHYgIT0gcCAmJiBzelt2XSA+IHN6W214XSkgbXggPSB2OwogICAgaWYgKG14KSBobGQobXgsIHUpOwogICAgZm9yIChpbnQgdiA6IGFbdV0pIGlmICh2ICE9IHAgJiYgdiAhPSBteCl7CiAgICAgICAgY2hhaW4rKzsKICAgICAgICBobGQodiwgdSk7CiAgICB9Cn0KCnZvaWQgdXBkaGxkKGludCB1LCBpbnQgdiwgbGwgdyl7CiAgICB3aGlsZSAoaWRbdV0gIT0gaWRbdl0pewogICAgICAgIGlmIChoW2hlYWRbaWRbdV1dXSA8IGhbaGVhZFtpZFt2XV1dKSBzd2FwKHUsIHYpOwogICAgICAgIHVwZGF0ZSgxLCAxLCBuLCBwb3NbaGVhZFtpZFt1XV1dLCBwb3NbdV0sIHcpOwogICAgICAgIHUgPSBwYVtoZWFkW2lkW3VdXV07CiAgICB9CiAgICBpZiAoaFt1XSA+IGhbdl0pIHN3YXAodSwgdik7CiAgICB1cGRhdGUoMSwgMSwgbiwgcG9zW3VdLCBwb3Nbdl0sIHcpOwp9CgpsbCBxdWVyeShpbnQgdSwgaW50IHYpewogICAgbGwgcmVzID0gMDsKICAgIHdoaWxlIChpZFt1XSAhPSBpZFt2XSl7CiAgICAgICAgaWYgKGhbaGVhZFtpZFt1XV1dIDwgaFtoZWFkW2lkW3ZdXV0pIHN3YXAodSwgdik7CiAgICAgICAgcmVzICs9IGdldCgxLCAxLCBuLCBwb3NbaGVhZFtpZFt1XV1dLCBwb3NbdV0pOwogICAgICAgIHUgPSBwYVtoZWFkW2lkW3VdXV07CiAgICB9CiAgICBpZiAoaFt1XSA+IGhbdl0pIHN3YXAodSwgdik7CiAgICByZXMgKz0gZ2V0KDEsIDEsIG4sIHBvc1t1XSwgcG9zW3ZdKTsKICAgIHJldHVybiByZXM7Cn0KCmludCBtYWluKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBjb3V0LnRpZShOVUxMKTsKICAgIGNpbiA+PiBuID4+IHQ7CiAgICBGT1IoaSwgMSwgbikgY2luID4+IHdpW2ldOwogICAgRk9SKGksIDEsIG4gLSAxKXsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGFbdV0ucGIodik7CiAgICAgICAgYVt2XS5wYih1KTsKICAgIH0KICAgIGRmcygxLCAxKTsKICAgIGhsZCgxLCAxKTsKICAgIGJ1aWxkdCgxLCAxLCBuKTsKICAgIHdoaWxlICh0LS0pewogICAgICAgIGludCB0eXBlOwogICAgICAgIGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlID09IDEpewogICAgICAgICAgICBpbnQgdSwgdjsKICAgICAgICAgICAgbGwgdzsKICAgICAgICAgICAgY2luID4+IHUgPj4gdiA+PiB3OwogICAgICAgICAgICB1cGRobGQodSwgdiwgdyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHUsIHY7CiAgICAgICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgICAgIGNvdXQgPDwgcXVlcnkodSwgdikgPDwgZW5kbDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQo=