#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream F("heavypath.in");
ofstream G("heavypath.out");
#define N 100010
int n,m,Y,v[N],f[N],V[N],w[N],l[N],c[4*N],t,x,y,a,b,i,T[N],Z[N],I[N],P[N],s;
vector<int> g[N],p[N];
pair<int,pair<int,int> > o[N];
void D(int q)
{
f[q]=w[q]=1;
int H=-1,F=1;
vector<int>::iterator i;
for(i=g[q].begin();i!=g[q].end();++i) {
if(f[*i])
continue;
F=0,V[*i]=V[q]+1,D(*i),w[q]+=w[*i];
if(H==-1)
H=*i;
else if(w[H]<w[*i])
H=*i;
}
if(F) {
l[q]=++Y,I[Y]=1,p[Y].push_back(q);
return;
}
l[q]=l[H],++I[l[q]],p[l[q]].push_back(q);
for(i=g[q].begin();i!=g[q].end();++i) {
if((*i)==H||V[*i]<V[q])
continue;
T[l[*i]]=q,Z[l[*i]]=V[q];
}
}
void B(int q,int L,int R,int d,int l)
{
if(L==R) {
c[q+d]=v[p[l][L-1]];
return;
}
int e=(L+R)/2;
B(q*2,L,e,d,l);
B(q*2+1,e+1,R,d,l);
c[q+d]=max(c[q*2+d],c[q*2+1+d]);
}
void U(int q,int L,int R,int p,int v,int d)
{
if(L==R) {
c[q+d]=v;
return;
}
int e=(L+R)/2;
if(p<=e)
U(q*2,L,e,p,v,d);
else
U(q*2+1,e+1,R,p,v,d);
c[q+d]=max(c[q*2+d],c[q*2+1+d]);
}
int Q(int q,int L,int R,int E,int F,int d)
{
if(E<=L&&R<=F)
return c[q+d];
int e=(L+R)/2,r=0;
if(E<=e)
r=max(r,Q(q*2,L,e,E,F,d));
if(e<F)
r=max(r,Q(q*2+1,e+1,R,E,F,d));
return r;
}
int main()
{
F>>n>>m;
for(i=1;i<=n;++i)
F>>v[i];
for(i=1;i<n;++i)
F>>a>>b,g[a].push_back(b),g[b].push_back(a);
for(i=1;i<=m;++i)
F>>t>>x>>y,o[i]=make_pair(t,make_pair(x,y));
V[1]=1,D(1);
for(i=1;i<=Y;++i) {
reverse(p[i].begin(),p[i].end());
if(i>1)
P[i]=P[i-1]+I[i-1]*4;
B(1,1,I[i],P[i],i);
}
for(i=1;i<=m;++i) {
t=o[i].first,x=o[i].second.first,y=o[i].second.second;
if(!t)
U(1,1,I[l[x]],V[x]-Z[l[x]],y,P[l[x]]);
else {
s=0;
while(1) {
if(l[x]==l[y]) {
if(V[x]>V[y])
swap(x,y);
s=max(s,Q(1,1,I[l[x]],V[x]-Z[l[x]],V[y]-Z[l[x]],P[l[x]]));
break;
}
if(Z[l[x]]<Z[l[y]])
swap(x,y);
s=max(s,Q(1,1,I[l[x]],1,V[x]-Z[l[x]],P[l[x]])),x=T[l[x]];
}
G<<s<<"\n";
}
}
return 0;
}