#include<fstream>
#include<vector>
#define DIM 100005
using namespace std;
int n, m, i, x, y, ii, jj, sol, nr, q;
int niv[DIM], t[DIM], tl[DIM], ind[DIM], st[DIM], val[DIM], aint[5 * DIM], ln[DIM], num[DIM], viz[DIM];
vector<int> v[DIM], w[DIM];
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
void dfs(int nod){
viz[nod] = num[nod] = 1;
int ii = 0;
for(int i = 0; i < v[nod].size(); i++){
int vecin = v[nod][i];
if(viz[vecin] == 0){
t[vecin] = nod;
niv[vecin] = niv[nod] + 1;
dfs(vecin);
num[nod] += num[vecin];
if(num[vecin] > num[ii]){
ii = vecin;
}
}
}
if(ii == 0){
nr++;
ln[nod] = nr;
w[nr].push_back(nod);
tl[nr] = t[nod];
}
else{
ln[nod] = ln[ii];
w[ ln[ii] ].push_back(nod);
tl[ ln[ii] ] = t[nod];
}
}
void build(int nod, int st, int dr, int p, int i){
if(st == dr){
aint[nod + p] = val[ w[i][st - 1] ];
}
else{
int mid = (st + dr) / 2;
build(2 * nod, st, mid, p, i);
build(2 * nod + 1, mid + 1, dr, p, i);
aint[nod + p] = max(aint[2 * nod + p], aint[2 * nod + 1 + p]);
}
}
void update(int nod, int st, int dr, int x, int y, int p){
if(st == dr){
aint[nod + p] = y;
}
else{
int mid = (st + dr) / 2;
if(x <= mid){
update(2 * nod, st, mid, x, y, p);
}
else{
update(2 * nod + 1, mid + 1, dr, x, y, p);
}
aint[nod + p] = max(aint[2 * nod + p], aint[2 * nod + 1 + p]);
}
}
void query(int nod, int st, int dr, int x, int y, int p){
if(x <= st && dr <= y){
sol = max(sol, aint[nod + p]);
}
else{
int mid = (st + dr) / 2;
if(x <= mid){
query(2 * nod, st, mid, x, y, p);
}
if(y > mid){
query(2 * nod + 1, mid + 1, dr, x, y, p);
}
}
}
int main(){
fin>> n >> m;
for(i = 1; i <= n; i++){
fin>> val[i];
}
for(i = 1; i < n; i++){
fin>> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1);
for(i = 1; i <= nr; i++){
for(ii = 0, jj = w[i].size() - 1; ii <= jj; ii++, jj--){
swap(w[i][ii], w[i][jj]);
ind[ w[i][ii] ] = ii + 1;
ind[ w[i][jj] ] = jj + 1;
}
st[i] = st[i - 1] + 4 * w[i - 1].size();
build(1, 1, w[i].size(), st[i], i);
}
for(; m; m--){
fin>> q >> x >> y;
if(q == 0){
val[x] = y;
ii = ln[x];
update(1, 1, w[ii].size(), ind[x], y, st[ii]);
continue;
}
sol = 0;
while(ln[x] != ln[y]){
ii = ln[x];
jj = ln[y];
if(niv[ tl[ii] ] > niv[ tl[jj] ]){
query(1, 1, w[ii].size(), 1, ind[x], st[ii]);
x = tl[ii];
}
else{
query(1, 1, w[jj].size(), 1, ind[y], st[jj]);
y = tl[jj];
}
}
ii = ln[x];
x = ind[x];
y = ind[y];
if(x > y){
swap(x, y);
}
query(1, 1, w[ii].size(), x, y, st[ii]);
fout<< sol <<"\n";
}
return 0;
}