#include <bits/stdc++.h>
#define NM 100005
using namespace std;
ifstream fin ("heavypath.in");
ofstream fout ("heavypath.out");
int n, m, niv[NM], sz[NM], head[NM], t[NM];
int vl[NM], aux[NM], aint[4*NM];
int hv[NM], poz[NM], z;
vector<int> v[NM];
inline void read();
void dfs(int nod)
{
sz[nod] = 1;
int max_sz = 0, care;
for(auto it:v[nod])
if(it!=t[nod])
{
niv[it] = niv[nod] + 1;
t[it] = nod;
dfs(it);
sz[nod]+=sz[it];
if(sz[it] > max_sz)
{
care = it;
max_sz = sz[it];
}
}
if(max_sz >= sz[nod]/2 && max_sz)
hv[nod] = care;
}
void build(int nod, int st, int dr)
{
if(st == dr)
aint[nod] = vl[st];
else
{
int mijl = (st+dr)/2;
build(nod*2, st, mijl);
build(nod*2+1, mijl+1, dr);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
}
void update(int nod, int st, int dr, int x, int y)
{
if(st == dr)
aint[nod] = y;
else
{
int mijl = (st+dr)/2;
if(x <= mijl)
update(nod*2, st, mijl, x, y);
else
update(nod*2+1, mijl+1, dr, x, y);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
}
int query(int nod, int st, int dr, int x, int y)
{
if(x <= st && dr <= y)
return aint[nod];
else
{
int mijl = (st+dr)/2, rez = 0;
if(x <= mijl)
rez = max(rez, query(2*nod, st, mijl, x, y));
if(y >= mijl+1)
rez = max(rez, query(2*nod+1, mijl+1, dr, x, y));
return rez;
}
}
void decompose(int nod, int h)
{
head[nod] = h;
vl[++z] = aux[nod];
poz[nod] = z;
if(hv[nod])
decompose(hv[nod], h);
for(auto it:v[nod])
if(it!=t[nod] && it!=hv[nod])
decompose(it, it);
}
int the_query(int x, int y)
{
int rez = 0;
for( ;head[x]!=head[y];)
if(niv[head[x]] > niv[head[y]])
{
rez = max(rez, query(1, 1, n, poz[head[x]], poz[x]));
x = t[head[x]];
}
else
{
rez = max(rez, query(1, 1, n, poz[head[y]], poz[y]));
y = t[head[y]];
}
rez = max(rez, query(1, 1, n, poz[head[x]], poz[x]));
rez = max(rez, query(1, 1, n, poz[head[y]], poz[y]));
return rez;
}
int main()
{
read();
dfs(1);
decompose(1, 1);
build(1, 1, n);
while(m--)
{
int op, x, y;
fin >> op >> x >> y;
if(op == 0)
update(1, 1, n, poz[x], y);
else fout << the_query(x, y) << '\n';
}
return 0;
}
inline void read()
{
int x, y;
fin >> n >> m;
for(int i=1; i<=n; i++)
fin >> aux[i];
for(int i=1; i<n; i++)
{
fin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
}