#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int M=100001;
int n,m,t,x,y,z,nrchain,i,nr,j,k;
int v[M],h[M],s[M],ind[M],poz[M],nodes[M],pLant[M],arb[2*M];
vector<int> l[M],chain[M];
bool viz[M];
void D(int x,int p)
{
int best=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[best]<s[l[x][i]])
best=l[x][i];
}
for(i=0;i<j;++i)
if(l[x][i]!=p&&l[x][i]!=best)
pLant[ind[l[x][i]]]=x;
if(!best)
ind[x]=++nrchain;
else
ind[x]=ind[best];
chain[ind[x]].push_back(x);
}
void U(int pos,int val)
{
pos+=n,arb[pos]=val;
for(;pos>1;pos>>=1)
arb[pos>>1]=max(arb[pos],arb[pos^1]);
}
int Q(int x,int y)
{
int res = 0;
for(x+=n,y+=n;x<y;x>>=1,y>>=1)
{
if(x&1)
res=max(res,arb[x++]);
if(y&1)
res=max(res,arb[--y]);
}
return res;
}
int H(int x,int y)
{
int res=0;
while(ind[x]!=ind[y])
{
if(h[pLant[ind[x]]]<h[pLant[ind[y]]])
swap(x,y);
res=max(res,Q(poz[x],poz[chain[ind[x]].back()]+1)),x=pLant[ind[x]];
}
if(poz[x]>poz[y])
swap(x,y);
return max(res,Q(poz[x],poz[y]+1));
}
int main()
{
freopen("heavypath.in","r",stdin),freopen("heavypath.out","w",stdout),scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",v+i);
for(i=0;i<n-1;++i)
scanf("%d%d",&x,&y),l[x].push_back(y),l[y].push_back(x);
for(D(1,0),i=1;i<=nrchain;++i)
for(k=chain[i].size(),j=0;j<k;++j)
poz[chain[i][j]]=++nr,nodes[nr]=chain[i][j],arb[nr+n]=v[chain[i][j]];
for(i=n;i;--i)
arb[i]=max(arb[2*i],arb[2*i+1]);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&t,&x,&y);
if(!t)
U(poz[x],y);
else if(t==1)
printf("%d\n",H(x,y));
}
}