#include <fstream>
#include <cstring>
#include <queue>
#define DIM 100001
#include<algorithm>
using namespace std;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
int sol,nr,n,m,i,a,b,lnr,d[DIM],niv[DIM],f[DIM],t[DIM],c[DIM],poz[DIM],z;
vector<int> v[DIM],l[DIM],aib[DIM];
void build(int tip,int nod, int st, int dr)
{
if(st==dr)
{while(aib[tip].size()<=nod)aib[tip].push_back(0);aib[tip][nod-1]=c[l[tip][++nr]];}
else
{
int mid=(st+dr)/2;build(tip,2*nod, st, mid);build(tip,2*nod+1, mid+1, dr);
aib[tip][nod-1]=max(aib[tip][2*nod-1],aib[tip][2*nod]);
}
}
void update(int tip,int nod,int st,int dr,int poz,int val)
{
if(st==dr)aib[tip][nod-1]=val;
else
{
int mid=(st+dr)/2;
if(poz<=mid)update(tip,2*nod, st, mid, poz, val);
if(poz>mid)update(tip,2*nod+1, mid+1, dr, poz, val);
aib[tip][nod-1]=max(aib[tip][2*nod-1],aib[tip][2*nod]);
}
}
void vas(int tip,int nod, int st, int dr, int x, int y)
{
if(x<=st&&y>=dr)sol=max(sol, aib[tip][nod-1]);
else
{
int mid=(st+dr)/2;
if(x<=mid)vas(tip,2*nod,st,mid,x,y);
if(mid+1<=y)vas(tip,2*nod+1,mid+1,dr,x,y);
}
}
void dfs(int nod,int tata,int nivel)
{
int maxi=0,aux,vecin,i;
niv[nod]=nivel;
if(v[nod].size()==1&&nod!=1)
{
l[++lnr].push_back(nod);
f[nod]=lnr;poz[nod]=l[f[nod]].size();
}
for(i=0;i<v[nod].size();i++)
{
vecin=v[nod][i];if(vecin==tata)continue;
dfs(vecin,nod,niv[nod]+1);d[nod]+=d[vecin];
if(maxi<d[vecin]){maxi=d[vecin];aux=i;}
}
for(i=0;i<v[nod].size();i++)
{vecin=v[nod][i];if(vecin==tata)continue;if(i!=aux)t[f[vecin]]=nod;else{l[f[vecin]].push_back(nod);f[nod]=f[vecin];poz[nod]=l[f[nod]].size();}}
d[nod]++;
}
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)fin>>c[i];
for(i=1;i<n;i++){fin>>a>>b;v[a].push_back(b);v[b].push_back(a);}
dfs(1,0,1);
for(i=1;i<=n;i++)if(v[i].size()==1)
{nr=-1;build(f[i],1,1,l[f[i]].size());}
for(i=1;i<=m;i++)
{
fin>>z>>a>>b;
if(z==0)update(f[a],1,1,l[f[a]].size(),poz[a],b);
else
{
sol=0;
while(f[a]!=f[b])
{
if(niv[t[f[a]]]<niv[t[f[b]]])
{
vas(f[b],1,1,l[f[b]].size(),poz[b],l[f[b]].size());
b=t[f[b]];
}
else
{
vas(f[a],1,1,l[f[a]].size(),poz[a],l[f[a]].size());
a=t[f[a]];
}
}
if(poz[a]>poz[b]) swap(a,b);
vas(f[a],1,1,l[f[a]].size(),poz[a],poz[b]);
fout<<sol<<"\n";
}
}
return 0;
}