#include <bits/stdc++.h>
using namespace std;
class HeavyPath {
int n, k;
vector <vector <int>>& g;
vector <int> t, trans, path, head, h, sz;
vector <vector <int>> comp;
void dfs(int u, int p) {
h[u] = h[p] + 1;
int link = 0;
for(int v : g[u]) if(v != p) {
dfs(v, u);
sz[u] += sz[v];
if(sz[v] > sz[link])
link = v;
}
if(link == 0) path[u] = k++;
else path[u] = path[link];
comp[path[u]].push_back(u);
for(int v : g[u]) if(v != p && v != link)
head[path[v]] = u;
}
void light_update(int pos, int x) {
for(t[pos += n] = x; pos > 1; pos >>= 1)
t[pos >> 1] = max(t[pos], t[pos ^ 1]);
}
int heavy_query(int l, int r) {
int res = 0;
for(l += n, r += n; l < r; l >>= 1, r >>= 1) {
if(l & 1) res = max(res, t[l++]);
if(r & 1) res = max(res, t[--r]);
}
return res;
}
public:
HeavyPath(int n, int* val, vector <vector <int>>& _g) : n(n), k(0), g(_g), t(2 * n), trans(n + 1, 0), path(n + 1, 0), head(n + 1, 0), h(n + 1, 0), sz(n + 1, 1), comp(n + 1) {
sz[0] = 0; dfs(1, 0);
for(int i = 0, cnt = 0; i < k; i++)
for(int u : comp[i])
trans[u] = cnt++;
for(int i = 1; i <= n; i++)
t[trans[i] + n] = val[i];
for(int i = n - 1; i > 0; i--)
t[i] = max(t[i << 1], t[i << 1 | 1]);
}
void update(int x, int y) { return light_update(trans[x], y); }
int query(int x, int y) {
int res = 0;
for(; path[x] != path[y]; x = head[path[x]]) {
if(h[head[path[x]]] < h[head[path[y]]]) swap(x, y);
res = max(res, heavy_query(trans[x], trans[comp[path[x]].back()] + 1));
}
if(trans[x] > trans[y]) swap(x, y);
return max(res, heavy_query(trans[x], trans[y] + 1));
}
};
const int N = 1e5;
int val[N + 5];
vector <vector <int>> g;
int main()
{
ifstream cin("heavypath.in");
ofstream cout("heavypath.out");
int n, m, u, v;
cin >> n >> m;
g.resize(n + 1);
for(int i = 1; i <= n; i++)
cin >> val[i];
for(int i = 1; i < n; i++)
cin >> u >> v,
g[u].push_back(v),
g[v].push_back(u);
HeavyPath HLD(n, val, g);
for(int i = 1; i <= m; i++) {
int t, x, y;
cin >> t >> x >> y;
if(t == 1) cout << HLD.query(x, y) << "\n";
else HLD.update(x, y);
}
return 0;
}