#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N = 200200;
int n, q, tim;
int parent[N], depth[N], sz[N], heavy[N];
int head[N], pos[N];
long long a[N], base[N], t[4 * N];
vector<int> g[N];
void dfs_size(int v, int p) {
parent[v] = p;
sz[v] = 1;
for (int u : g[v]) {
if (u == p) {
continue;
}
depth[u] = depth[v] + 1;
dfs_size(u, v);
sz[v] += sz[u];
if (heavy[v] == 0 || sz[u] > sz[heavy[v]]) {
heavy[v] = u;
}
}
}
void decompose(int v, int h) {
head[v] = h;
pos[v] = ++tim;
base[tim] = a[v];
if (heavy[v] != 0) {
decompose(heavy[v], h);
}
for (int u : g[v]) {
if (u != parent[v] && u != heavy[v]) {
decompose(u, u);
}
}
}
void build(int x, int l, int r) {
if (l == r) {
t[x] = base[l];
return;
}
int m = (l + r) / 2;
build(x * 2, l, m);
build(x * 2 + 1, m + 1, r);
t[x] = t[x * 2] + t[x * 2 + 1];
}
void upd(int x, int l, int r, int p, long long y) {
if (l == r) {
t[x] = y;
return;
}
int m = (l + r) / 2;
if (p <= m) {
upd(x * 2, l, m, p, y);
} else {
upd(x * 2 + 1, m + 1, r, p, y);
}
t[x] = t[x * 2] + t[x * 2 + 1];
}
long long get(int x, int l, int r, int tl, int tr) {
if (tl > tr) {
return 0;
} else if (l == tl && r == tr) {
return t[x];
}
int m = (l + r) / 2;
return get(x * 2, l, m, tl, min(m, tr)) + get(x * 2 + 1, m + 1, r, max(m + 1, tl), tr);
}
long long get_path(int v, int u) {
long long result = 0;
while (head[v] != head[u]) {
if (depth[head[v]] < depth[head[u]]) {
swap(v, u);
}
result += get(1, 1, n, pos[head[v]], pos[v]);
v = parent[head[v]];
}
if (depth[v] > depth[u]) {
swap(v, u);
}
result += get(1, 1, n, pos[v], pos[u]);
return result;
}
void solve() {
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i < n; i++) {
int v, u;
cin >> v >> u;
g[v].push_back(u);
g[u].push_back(v);
}
dfs_size(1, 0);
decompose(1, 1);
build(1, 1, n);
while (q--) {
int type, v;
cin >> type >> v;
if (type == 1) {
long long x;
cin >> x;
upd(1, 1, n, pos[v], x);
} else {
int u;
cin >> u;
cout << get_path(v, u) << '\n';
}
}
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
solve();
return 0;
}