#include <bits/stdc++.h>
#include <cstring>
#include <cstdio>
#pragma GCC optimize ("O3")
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define bminify(a,b)a=bmin(a,b)
#define bmaxify(a,b)a=bmax(a,b)
#define forq(i,ii,n)for(i=ii;i<n;i++)
#define f first
#define s second
#define mod 1000000007ll
#define nmax 200002
#define lim 351
using namespace std;
typedef long long ll;
ifstream in("heavypath.in");
ofstream out("heavypath.out");
//FILE *fin=fopen("infasuratoare.in","r");
//FILE *fout=fopen("infasuratoare.out","w");
int n,m,i,j,k,l,v[nmax],e[nmax*2],le[nmax],s[nmax],c[nmax],u[nmax],f[nmax],q,x,y,z,o,vr,vl,d;vector<int>g[nmax],ai[nmax],r[nmax];
void df(int i){
c[i]=i;
for(auto j:g[i])
if(j!=f[i]){
f[j]=i,le[j]=le[i]+1;df(j);
if(s[c[j]]>s[c[i]])c[i]=c[j];
}
++s[c[i]],r[c[i]].emplace_back(i);
}
void qu(int x,int y,int z){
//cout<<x<<' '<<y<<' '<<vr<<' '<<vr<<'\n';
if(z<vr&&z+y>vl){
if(z>=vl&&z+y<=vr)
bmaxify(o,ai[d][x])/*,cout<<"f"<<x<<' '<<d<<' '<<' '<<ai[d].size()<<' '<<ai[d][x]<<'\n'*/;
else qu(x*2,y/2,z),qu(x*2+1,y/2,z+y/2);
}
}
int main()
{
in>>n>>m;
forq(i,1,n+1)in>>v[i];
for(k=1;k<n;k++)
in>>i>>j,g[i].emplace_back(j),g[j].emplace_back(i);
le[1]=1;
df(1);
//for(i=1;i<=n;i++)cout<<i<<' '<<c[i]<<' '<<s[c[i]]<<'\n';
for(i=1;i<=n;i++)
if(s[i]){
u[i]=s[i]*2-1;
while(u[i]&(u[i]-1))u[i]&=u[i]-1;
ai[i].resize(2*u[i],0);
for(j=0;j<s[i];j++)
ai[i][u[i]+j]=v[r[i][j]];
//cout<<i<<' '<<s[i]<<' '<<le[c[x]]-le[x]+u[c[x]]<<'\n';
//for(k=0;k<u[i]*2;k++)cout<<ai[i][k]<<' ';cout<<'\n';
for(j=u[i]-1;j;j--)
ai[i][j]=bmax(ai[i][j*2],ai[i][j*2+1]);
}
while(m--){
in>>q>>x>>y;
o=0;
if(q==0){
i=le[c[x]]-le[x]+u[c[x]];
ai[c[x]][i]=v[x]=y;
while(i>1)
i/=2,ai[c[x]][i]=bmax(ai[c[x]][i*2],ai[c[x]][i*2+1]);
//cout<<x<<' '<<c[x]<<' '<<le[c[x]]-le[x]+u[c[x]]<<'\n';
//for(i=0;i<u[c[x]]*2;i++)cout<<ai[c[x]][i]<<' ';cout<<'\n';
}
else{
while(c[x]!=c[y]){
if(le[c[x]]-s[c[x]]<le[c[y]]-s[c[y]])sw(x,y);
//cout<<x<<' '<<y<<'\n';
vl=le[c[x]]-le[x];
vr=s[c[x]];
d=c[x];
qu(1,u[c[x]],0);
x=f[*(r[c[x]].rbegin())];
}
vl=le[c[x]]-le[x];
vr=le[c[y]]-le[y];
d=c[x];
if(vl>vr)sw(vl,vr);
++vr;
qu(1,u[c[x]],0);
out<<o<<'\n';
}
}
}