#include <bits/stdc++.h>
#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
///#include <tryhardmode>
///#include <GODMODE::ON>
using namespace std;
#define cin fin
#define cout fout
ifstream fin ("heavypath.in");
ofstream fout ("heavypath.out");
const int NMAX=2e5+5;
vector<int>v[NMAX];
int aint[4*NMAX];
int head[NMAX];
int sarb[NMAX];
int lvl[NMAX];
int ti[NMAX];
int a[NMAX];
int t[NMAX];
int kon;
int n;
void dfs1(int p,int tata)
{
lvl[p]=lvl[tata]+1;
sarb[p]=1;
head[p]=p;
t[p]=tata;
for(auto i:v[p])
{
if(i!=tata)
{
dfs1(i,p);
sarb[p]+=sarb[i];
}
}
}
void dfs2(int p)
{
int maxim=-1,hc=-1;
ti[p]=++kon;
for(auto i:v[p])
{
if(i!=t[p])
{
if(maxim<sarb[i])
{
maxim=sarb[i];
hc=i;
}
}
}
if(hc<0)
return ;
else
{
head[hc]=head[p];
dfs2(hc);
for(auto i:v[p])
{
if(i!=t[p] && i!=hc)
dfs2(i);
}
}
}
void build(int p,int st,int dr)
{
int mij;
if(st==dr)
{
aint[p]=a[ti[st]];
return ;
}
else
{
mij=st+dr;
mij/=2;
build(2*p,st,mij);
build(2*p+1,mij+1,dr);
aint[p]=max(aint[2*p],aint[2*p+1]);
}
}
void update(int p,int st,int dr,int a,int b)
{
int mij;
if(st==dr)
{
aint[p]=b;
return ;
}
else
{
mij=st+dr;
mij/=2;
if(a<=mij)
update(2*p,st,mij,a,b);
else
update(2*p+1,mij+1,dr,a,b);
aint[p]=max(aint[2*p],aint[2*p+1]);
}
}
int query(int p,int st,int dr,int l,int r)
{
int mij,a=-1;
if(l<=st && dr<=r)
return aint[p];
else
{
mij=st+dr;
mij/=2;
if(l<=mij)
a=max(a,query(2*p,st,mij,l,r));
if(mij<r)
a=max(a,query(2*p+1,mij+1,dr,l,r));
return a;
}
}
int solve(int a,int b)
{
if(head[a]==head[b])
{
if(ti[a]>ti[b])
swap(a,b);
return query(1,1,n,ti[a],ti[b]);
}
if(lvl[head[a]]<lvl[head[b]])
swap(a,b);
int aux=solve(t[head[a]],b);
return max(aux,query(1,1,n,ti[head[a]],ti[a]));
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m,i,j,q;
cin>>n>>q;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs1(1,0);
dfs2(1);
build(1,1,n);
while(q--)
{
int type,x,y;
cin>>type>>x>>y;
if(type==0)
update(1,1,n,ti[x],y);
if(type==1)
cout<<solve(x,y)<<"\n";
}
return 0;
}