#include<fstream>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
ifstream in("heavypath.in");
ofstream out("heavypath.out");
const int Nmax = 100001;
vector<int> G[Nmax],Tr[Nmax];
vector<int> Ch[Nmax];
int Chfat[Nmax],Lev[Nmax];
int Pof[Nmax],Pos[Nmax];
int v[Nmax],*A[Nmax];
int h[Nmax];
int N,M,K,root;
void dfsH(int x,int l){
h[x]=1,Lev[x]=l;
for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
if(!h[*it]) Tr[x].push_back(*it),dfsH(*it,l+1),h[x]+=h[*it];
}
}
void dfsC(int x,int k){
Ch[k].push_back(x);
Pof[x]=k,Pos[x]=Ch[k].size();
if(G[x].size()){
int m=0,c;
for(vector<int>::iterator it=Tr[x].begin();it!=Tr[x].end();++it){
if(h[*it]>m) m=h[*it],c=*it;
}
for(vector<int>::iterator it=Tr[x].begin();it!=Tr[x].end();++it){
if(*it==c) dfsC(*it,k);
else Chfat[++K]=x,dfsC(*it,K);
}
}
}
void upd(int A[],int i,int st,int dr,int w,int val){
if(st>=dr) A[i]=val;
else{
int mij=(st+dr)/2;
if(w<=mij) upd(A,2*i,st,mij,w,val);
else upd(A,2*i+1,mij+1,dr,w,val);
A[i]=max(A[2*i],A[2*i+1]);
}
}
int query(int A[],int i,int st,int dr,int a,int b){
if(a<=st && dr<=b) return A[i];
int mij=(st+dr)/2;
if(b<=mij) return query(A,2*i,st,mij,a,b);
else if(a>mij) return query(A,2*i+1,mij+1,dr,a,b);
else{
int ans1=query(A,2*i,st,mij,a,mij);
int ans2=query(A,2*i+1,mij+1,dr,mij+1,b);
return max(ans1,ans2);
}
}
int hpd(int x,int y){
int ans=0;
while(Pof[x]!=Pof[y]){
if(Lev[Chfat[Pof[x]]] < Lev[Chfat[Pof[y]]]) swap(x,y);
ans=max(ans, query(A[Pof[x]],1,1,Ch[Pof[x]].size(),1,Pos[x]) );
x=Chfat[Pof[x]];
}
if(Pos[x]>Pos[y]) swap(x,y);
ans=max(ans, query(A[Pof[x]],1,1,Ch[Pof[x]].size(),Pos[x],Pos[y]) );
return ans;
}
int main(){
in>>N>>M;
int x,y;
for(int i=1;i<=N;i++) in>>v[i];
for(int i=1;i<N;i++){
in>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
root=rand()%N+1; root=1;
dfsH(root,1),dfsC(root,++K);
for(int i=1;i<=K;i++){
A[i]=new int[4*(Ch[i].size()+5)];
for(int j=0;j<4*(Ch[i].size()+5);j++) A[i][j]=0;
}
for(int i=1;i<=N;i++) upd(A[Pof[i]],1,1,Ch[Pof[i]].size(),Pos[i],v[i]);
for(int i=1;i<=M;i++){
in>>x;
if(x==0){
in>>x>>y;
v[x]=y;
upd(A[Pof[x]],1,1,Ch[Pof[x]].size(),Pos[x],v[x]);
}
else{
in>>x>>y;
out<<hpd(x,y)<<'\n';
}
}
return 0;
}