#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
#define NMAX 100005
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
vector <int> v[NMAX],Lant[NMAX];
bitset <NMAX> viz;
int n,m,k,t,x,y,q,a[NMAX],D[NMAX],Niv[NMAX],Tata[NMAX],Nr[NMAX];
int A[NMAX<<2],Start[NMAX],T[NMAX],X[NMAX];
void dfs(int nod, int niv, int tata)
{
int i,fiu,fmax=0;
Niv[nod]=niv, Tata[nod]=tata, viz[nod]=1;
D[nod]=1;
for (i=0;i<v[nod].size();++i)
{
fiu=v[nod][i];
if (!viz[fiu])
{
dfs(fiu,niv+1,nod);
D[nod]+=D[fiu];
if (D[fmax]<D[fiu])
fmax=fiu;
}
}
if (!fmax)
{
++k;
Lant[k].push_back(nod);
Nr[nod]=k;
T[k]=Tata[nod];
}
else
{
Nr[nod]=Nr[fmax];
Lant[Nr[nod]].push_back(nod);
T[Nr[nod]]=Tata[nod];
}
}
void update(int nod, int st, int dr, int p, int x, int decalaj)
{
if (st==dr)
{
A[nod+decalaj]=x;
return ;
}
int mij=(st+dr)>>1;
if (p<=mij)
update(nod<<1,st,mij,p,x,decalaj);
else
update(1+(nod<<1),mij+1,dr,p,x,decalaj);
A[nod+decalaj]=max(A[(nod<<1)+decalaj],A[1+(nod<<1)+decalaj]);
}
int query(int nod, int st, int dr, int a, int b, int decalaj)
{
if (a<=st && dr<=b)
return A[nod+decalaj];
int mij=(st+dr)>>1,qu=0;
if (a<=mij)
qu=max(qu,query(nod<<1,st,mij,a,b,decalaj));
if (mij<b)
qu=max(qu,query(1+(nod<<1),mij+1,dr,a,b,decalaj));
return qu;
}
int main()
{
int i,j,jj;
fin>>n>>m;
for (i=1;i<=n;++i)
fin>>a[i];
for (i=1;i<n;++i)
{
fin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,1,0);
for (i=1;i<=k;++i)
{
Start[i]=Start[i-1]+(Lant[i-1].size()<<2);
for (j=0,jj=Lant[i].size()-1;j<jj;++j,--jj)
{
swap(Lant[i][j],Lant[i][jj]);
X[Lant[i][j]]=j;
X[Lant[i][jj]]=jj;
}
X[Lant[i][j]]=j;
}
for (i=1;i<=n;++i)
update(1,0,Lant[Nr[i]].size()-1,X[i],a[i],Start[Nr[i]]);
for (i=1;i<=m;++i)
{
fin>>t>>x>>y;
if (!t)
update(1,0,Lant[Nr[x]].size()-1,X[x],y,Start[Nr[x]]);
else
{
if (Niv[T[Nr[x]]]>Niv[T[Nr[y]]])
swap(x,y);
q=0;
do
{
if (Niv[T[Nr[x]]]>Niv[T[Nr[y]]])
swap(x,y);
if (Nr[x]==Nr[y])
{
q=max(q,query(1,0,Lant[Nr[x]].size()-1,min(X[x],X[y]),max(X[x],X[y]),Start[Nr[x]]));
break;
}
q=max(q,query(1,0,Lant[Nr[y]].size()-1,0,X[y],Start[Nr[y]]));
y=T[Nr[y]];
} while (1);
fout<<q<<"\n";
}
}
return 0;
}