#include<cstdio>
#include<vector>
using namespace std;
const int M=100001,P=20000000;
int n,m,t,x,y,z,o,i,j,k;
int v[M],h[M],s[M],d[M],p[M],e[M],b[M],a[2*M],ro,re;
vector<int> l[M],c[M];
char ra[P];
inline char N()
{
if(ro==P)
fread(ra,1,P,stdin),ro=0;
return ra[ro++];
}
inline int A()
{
int x=0;
char c=N();
while(c<48)
c=N();
while(c>47)
x=x*10+c-48,c=N();
return x;
}
inline void S(int x)
{
int i,d=x>999999999?10:x>99999999?9:x>9999999?8:x>999999?7:x>99999?6:x>9999?5:x>999?4:x>99?3:x>9?2:1;
for(i=d-1;i>=0;x/=10,i--)
ra[re+i]=x%10+48;
ra[re+d]=10,re+=d+1;
}
inline void D(int x,int p)
{
int u=0,i,j;
h[x]=h[p]+1,s[x]=1;
for(j=l[x].size(),i=0;i<j;++i)
if(l[x][i]!=p)
{
D(l[x][i],x),s[x]+=s[l[x][i]];
if(s[u]<s[l[x][i]])
u=l[x][i];
}
for(i=0;i<j;++i)
if(l[x][i]!=p&&l[x][i]!=u)
b[d[l[x][i]]]=x;
d[x]=!u?++o:d[u];
c[d[x]].push_back(x);
}
inline void U(int p,int v)
{
for(p+=n,a[p]=v;p>1;p>>=1)
a[p>>1]=max(a[p],a[p^1]);
}
inline int Q(int x,int y)
{
int r=0;
for(x+=n,y+=n;x<y;x>>=1,y>>=1)
{
if(x&1)
r=max(r,a[x++]);
if(y&1)
r=max(r,a[--y]);
}
return r;
}
inline int H(int x,int y)
{
int r=0;
while(d[x]!=d[y])
{
if(h[b[d[x]]]<h[b[d[y]]])
swap(x,y);
r=max(r,Q(p[x],p[c[d[x]].back()]+1)),x=b[d[x]];
}
if(p[x]>p[y])
swap(x,y);
return max(r,Q(p[x],p[y]+1));
}
int main()
{
freopen("heavypath.in","r",stdin),freopen("heavypath.out","w",stdout),n=A(),m=A();
for(i=1;i<=n;++i)
v[i]=A();
for(i=0;i<n-1;++i)
x=A(),y=A(),l[x].push_back(y),l[y].push_back(x);
for(D(1,0),i=1;i<=o;++i)
for(k=c[i].size(),j=0;j<k;++j)
p[c[i][j]]=++z,e[z]=c[i][j],a[z+n]=v[c[i][j]];
for(i=n;i;--i)
a[i]=max(a[2*i],a[2*i+1]);
for(i=0;i<m;i++)
{
t=A(),x=A(),y=A();
if(!t)
U(p[x],y);
else if(t==1)
S(H(x,y));
}
fwrite(ra,1,re,stdout);
}