#include <bits/stdc++.h>
using namespace std;
int v[100555];
int val[100555];
int n,m;
int top[100555];
int sz[100555];
vector <int> s[100555];
int hv[100555];
int pos[100555];
int parent[100555];
int mx[400555];
int dpt[100555];
void dfss(int k,int p,int dt)
{
sz[k]=1;
hv[k]=-1;
dpt[k]=dt;
for(auto a:s[k])
{
if(a!=p)
{
dfss(a,k,dt+1);
sz[k]+=sz[a];
if(hv[k]==-1 || sz[a]>sz[hv[k]])
{
hv[k]=a;
}
}
}
}
int cnt=0;
void dfsh(int k,int p,int tp)
{
top[k]=tp;
parent[k]=p;
++cnt;
pos[k]=cnt;
val[pos[k]]=v[k];
if(hv[k]!=-1)
{
dfsh(hv[k],k,tp);
}
for(auto a:s[k])
{
if(a!=p && a!=hv[k])
{
dfsh(a,k,a);
}
}
}
void up(int l,int r,int nval,int in,int el)
{
int mij=(l+r)/2;
if(l==r)
{
mx[el]=nval;
}
else
{
if(in>=l && in<=mij)
{
up(l,mij,nval,in,el*2);
}
else
{
up(mij+1,r,nval,in,el*2+1);
}
mx[el]=max(mx[el*2],mx[el*2+1]);
}
}
int qr(int l,int r,int st,int dr,int el)
{
if(dr<l || st>r)
{
return INT_MIN;
}
if(l>=st && r<=dr)
{
return mx[el];
}
else
{
int mij;
mij=(l+r)/2;
int mxx=INT_MIN;
if(st<=mij)
{
int nrr=qr(l,mij,st,dr,el*2);
if(nrr>mxx)
{
mxx=nrr;
}
}
if((mij+1)<=dr)
{
int nrr=qr(mij+1,r,st,dr,el*2+1);
if(nrr>mxx)
{
mxx=nrr;
}
}
return mxx;
}
}
int pq(int x,int y)
{
int res=INT_MIN;
//cout<<top[x]<<" "<<top[y]<<"\n";
while(top[x]!=top[y])
{
if(dpt[top[x]]<dpt[top[y]])
{
swap(x,y);
}
res=max(res,qr(1,n,pos[top[x]],pos[x],1));
x=parent[top[x]];
}
if(dpt[x]>dpt[y])
{
swap(x,y);
}
res=max(res,qr(1,n,pos[x],pos[y],1));
return res;
}
int main()
{
ifstream cin("heavypath.in");
ofstream cout("heavypath.out");
parent[1]=1;
cin>>n>>m;
int x,y;
for(int i=1;i<=n;++i)
{
cin>>v[i];
}
for(int i=1;i<n;++i)
{
cin>>x>>y;
s[x].push_back(y);
s[y].push_back(x);
}
dfss(1,0,1);
dfsh(1,0,1);
int caz;
for(int i=1;i<=n;++i)
{
up(1,n,v[i],pos[i],1);
}
for(int i=1;i<=m;++i)
{
cin>>caz;
cin>>x>>y;
if(caz==0)
{
up(1,n,y,pos[x],1);
}
else
{
cout<<pq(x,y)<<"\n";
}
}
return 0;
}