#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const long long oo=1e9;
const int mod=1e9+7;
const int base=31;
int Test=1;
void home()
{
if(fopen("main.inp","r"))
freopen("main.inp","r",stdin),
freopen("main.out","w",stdout);
}
bool bit(int mask,int i){return (mask>>i)&1;}
struct Node{int gss,maL,maR,sum;};
Node Merge(Node a,Node b)
{
Node c;
c.gss=max(max(a.gss,b.gss),a.maR+b.maL);
c.maL=max(a.maL,a.sum+b.maL);
c.maR=max(b.maR,b.sum+a.maR);
c.sum=a.sum+b.sum;
return c;
}
struct SegTree
{
int n;vector<Node>f;vector<int>lazy;
SegTree(int _n):n(_n){f.resize(4*n+5);lazy.resize(4*n+5,-oo);}
void Push(int id,int l,int r,int val)
{
int gss=max(0,(r-l+1)*val);
f[id]={gss,gss,gss,(r-l+1)*val};
lazy[id]=val;
}
void Fix(int id,int l,int r)
{
if(lazy[id]!=-oo)
{
int m=(l+r)>>1;
Push(id<<1,l,m,lazy[id]);
Push(id<<1|1,m+1,r,lazy[id]);
lazy[id]=-oo;
}
}
void Update(int id,int l,int r,int u,int v,int val)
{
if(u>v)return;
if(l==u&&r==v)Push(id,l,r,val);
else
{
Fix(id,l,r);int m=(l+r)>>1;
Update(id<<1,l,m,u,min(v,m),val);
Update(id<<1|1,m+1,r,max(m+1,u),v,val);
f[id]=Merge(f[id<<1],f[id<<1|1]);
}
}
Node Get(int id,int l,int r,int u,int v)
{
if(u>v)return {0,0,0,0};
if(l==u&&r==v)return f[id];
else
{
Fix(id,l,r);int m=(l+r)>>1;
return Merge(Get(id<<1,l,m,u,min(v,m)),Get(id<<1|1,m+1,r,max(m+1,u),v));
}
}
void Update(int u,int v,int val){Update(1,1,n,u,v,val);}
Node Get(int u,int v){return Get(1,1,n,u,v);}
}*Seg;
int n,q;
int val[100005],sau[100005],par[100005],pos[100005],sz[100005];
int ChHd[100005],ChId[100005];
vector<int>a[100005];
void DFS(int u)
{
sz[u]=1;
for(int v:a[u])
{
if(v!=par[u])
{
par[v]=u;sau[v]=sau[u]+1;
DFS(v);sz[u]+=sz[v];
}
}
}
int CurPos,CurCh=1;
void HLD(int u)
{
if(!ChHd[CurCh])ChHd[CurCh]=u;
ChId[u]=CurCh;
pos[u]=++CurPos;
int hev=0;for(int v:a[u])if(v!=par[u])if(!hev||sz[hev]<sz[v])hev=v;
if(hev)HLD(hev);
for(int v:a[u])
{
if(v!=par[u]&&v!=hev)
{
CurCh++;
HLD(v);
}
}
}
int LCA(int u,int v)
{
while(ChId[u]!=ChId[v])
{
if(ChId[u]>ChId[v])u=par[ChHd[ChId[u]]];
else v=par[ChHd[ChId[v]]];
}
if(sau[u]>sau[v])return v;
return u;
}
Node Rev(Node a)
{
return {a.gss,a.maR,a.maL,a.sum};
}
int PathQuery(int u,int v)
{
int w=LCA(u,v);Node ma={0,0,0,0};
while(ChId[u]!=ChId[w])
{
ma=Merge(ma,Rev(Seg->Get(pos[ChHd[ChId[u]]],pos[u])));
u=par[ChHd[ChId[u]]];
}
vector<Node>vec;
while(ChId[v]!=ChId[w])
{
vec.push_back(Seg->Get(pos[ChHd[ChId[v]]],pos[v]));
v=par[ChHd[ChId[v]]];
}
if(sau[u]>sau[v])
{
ma=Merge(ma,Rev(Seg->Get(pos[v],pos[u])));
}
else
{
vec.push_back(Seg->Get(pos[u],pos[v]));
}
reverse(vec.begin(),vec.end());
for(Node x:vec)ma=Merge(ma,x);
return ma.gss;
}
void PathUpdate(int u,int v,int x)
{
int w=LCA(u,v);
while(ChId[u]!=ChId[w])
{
Seg->Update(pos[ChHd[ChId[u]]],pos[u],x);
u=par[ChHd[ChId[u]]];
}
while(ChId[v]!=ChId[w])
{
Seg->Update(pos[ChHd[ChId[v]]],pos[v],x);
v=par[ChHd[ChId[v]]];
}
if(sau[u]>sau[v])swap(u,v);
Seg->Update(pos[u],pos[v],x);
}
void Tcmduc_VOI26()
{
cin>>n>>q;Seg=new SegTree(n);
for(int i=1;i<=n;i++)cin>>val[i];
for(int i=1;i<n;i++)
{
int u,v;cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
DFS(1);HLD(1);
for(int i=1;i<=n;i++)Seg->Update(pos[i],pos[i],val[i]);
while(q--)
{
int type,u,v;cin>>type>>u>>v;
if(type==2)
{
int x;cin>>x;
PathUpdate(u,v,x);
}
else cout<<PathQuery(u,v)<<'\n';
}
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);home();
while(Test--)Tcmduc_VOI26();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgbG9uZyBsb25nIG9vPTFlOTsKY29uc3QgaW50IG1vZD0xZTkrNzsKY29uc3QgaW50IGJhc2U9MzE7CmludCBUZXN0PTE7CnZvaWQgaG9tZSgpCnsKICAgIGlmKGZvcGVuKCJtYWluLmlucCIsInIiKSkgCiAgICBmcmVvcGVuKCJtYWluLmlucCIsInIiLHN0ZGluKSwKICAgIGZyZW9wZW4oIm1haW4ub3V0IiwidyIsc3Rkb3V0KTsKfQpib29sIGJpdChpbnQgbWFzayxpbnQgaSl7cmV0dXJuIChtYXNrPj5pKSYxO30Kc3RydWN0IE5vZGV7aW50IGdzcyxtYUwsbWFSLHN1bTt9OwpOb2RlIE1lcmdlKE5vZGUgYSxOb2RlIGIpCnsKICAgIE5vZGUgYzsKICAgIGMuZ3NzPW1heChtYXgoYS5nc3MsYi5nc3MpLGEubWFSK2IubWFMKTsKICAgIGMubWFMPW1heChhLm1hTCxhLnN1bStiLm1hTCk7CiAgICBjLm1hUj1tYXgoYi5tYVIsYi5zdW0rYS5tYVIpOwogICAgYy5zdW09YS5zdW0rYi5zdW07CiAgICByZXR1cm4gYzsKfQpzdHJ1Y3QgU2VnVHJlZQp7CiAgICBpbnQgbjt2ZWN0b3I8Tm9kZT5mO3ZlY3RvcjxpbnQ+bGF6eTsKICAgIFNlZ1RyZWUoaW50IF9uKTpuKF9uKXtmLnJlc2l6ZSg0Km4rNSk7bGF6eS5yZXNpemUoNCpuKzUsLW9vKTt9CiAgICB2b2lkIFB1c2goaW50IGlkLGludCBsLGludCByLGludCB2YWwpCiAgICB7CiAgICAgICAgaW50IGdzcz1tYXgoMCwoci1sKzEpKnZhbCk7CiAgICAgICAgZltpZF09e2dzcyxnc3MsZ3NzLChyLWwrMSkqdmFsfTsKICAgICAgICBsYXp5W2lkXT12YWw7CiAgICB9CiAgICB2b2lkIEZpeChpbnQgaWQsaW50IGwsaW50IHIpCiAgICB7CiAgICAgICAgaWYobGF6eVtpZF0hPS1vbykKICAgICAgICB7CiAgICAgICAgICAgIGludCBtPShsK3IpPj4xOwogICAgICAgICAgICBQdXNoKGlkPDwxLGwsbSxsYXp5W2lkXSk7CiAgICAgICAgICAgIFB1c2goaWQ8PDF8MSxtKzEscixsYXp5W2lkXSk7CiAgICAgICAgICAgIGxhenlbaWRdPS1vbzsKICAgICAgICB9CiAgICB9CiAgICB2b2lkIFVwZGF0ZShpbnQgaWQsaW50IGwsaW50IHIsaW50IHUsaW50IHYsaW50IHZhbCkKICAgIHsKICAgICAgICBpZih1PnYpcmV0dXJuOwogICAgICAgIGlmKGw9PXUmJnI9PXYpUHVzaChpZCxsLHIsdmFsKTsKICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgRml4KGlkLGwscik7aW50IG09KGwrcik+PjE7CiAgICAgICAgICAgIFVwZGF0ZShpZDw8MSxsLG0sdSxtaW4odixtKSx2YWwpOwogICAgICAgICAgICBVcGRhdGUoaWQ8PDF8MSxtKzEscixtYXgobSsxLHUpLHYsdmFsKTsKICAgICAgICAgICAgZltpZF09TWVyZ2UoZltpZDw8MV0sZltpZDw8MXwxXSk7CiAgICAgICAgfQogICAgfQogICAgTm9kZSBHZXQoaW50IGlkLGludCBsLGludCByLGludCB1LGludCB2KQogICAgewogICAgICAgIGlmKHU+dilyZXR1cm4gezAsMCwwLDB9OwogICAgICAgIGlmKGw9PXUmJnI9PXYpcmV0dXJuIGZbaWRdOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIEZpeChpZCxsLHIpO2ludCBtPShsK3IpPj4xOwogICAgICAgICAgICByZXR1cm4gTWVyZ2UoR2V0KGlkPDwxLGwsbSx1LG1pbih2LG0pKSxHZXQoaWQ8PDF8MSxtKzEscixtYXgobSsxLHUpLHYpKTsKICAgICAgICB9CiAgICB9CiAgICB2b2lkIFVwZGF0ZShpbnQgdSxpbnQgdixpbnQgdmFsKXtVcGRhdGUoMSwxLG4sdSx2LHZhbCk7fQogICAgTm9kZSBHZXQoaW50IHUsaW50IHYpe3JldHVybiBHZXQoMSwxLG4sdSx2KTt9Cn0qU2VnOwppbnQgbixxOwppbnQgdmFsWzEwMDAwNV0sc2F1WzEwMDAwNV0scGFyWzEwMDAwNV0scG9zWzEwMDAwNV0sc3pbMTAwMDA1XTsKaW50IENoSGRbMTAwMDA1XSxDaElkWzEwMDAwNV07CnZlY3RvcjxpbnQ+YVsxMDAwMDVdOwp2b2lkIERGUyhpbnQgdSkKewogICAgc3pbdV09MTsKICAgIGZvcihpbnQgdjphW3VdKQogICAgewogICAgICAgIGlmKHYhPXBhclt1XSkKICAgICAgICB7CiAgICAgICAgICAgIHBhclt2XT11O3NhdVt2XT1zYXVbdV0rMTsKICAgICAgICAgICAgREZTKHYpO3N6W3VdKz1zelt2XTsKICAgICAgICB9CiAgICB9Cn0KaW50IEN1clBvcyxDdXJDaD0xOwp2b2lkIEhMRChpbnQgdSkKewogICAgaWYoIUNoSGRbQ3VyQ2hdKUNoSGRbQ3VyQ2hdPXU7CiAgICBDaElkW3VdPUN1ckNoOwogICAgcG9zW3VdPSsrQ3VyUG9zOwogICAgaW50IGhldj0wO2ZvcihpbnQgdjphW3VdKWlmKHYhPXBhclt1XSlpZighaGV2fHxzeltoZXZdPHN6W3ZdKWhldj12OwogICAgaWYoaGV2KUhMRChoZXYpOwogICAgZm9yKGludCB2OmFbdV0pCiAgICB7CiAgICAgICAgaWYodiE9cGFyW3VdJiZ2IT1oZXYpCiAgICAgICAgewogICAgICAgICAgICBDdXJDaCsrOwogICAgICAgICAgICBITEQodik7CiAgICAgICAgfQogICAgfQp9CmludCBMQ0EoaW50IHUsaW50IHYpCnsKICAgIHdoaWxlKENoSWRbdV0hPUNoSWRbdl0pCiAgICB7CiAgICAgICAgaWYoQ2hJZFt1XT5DaElkW3ZdKXU9cGFyW0NoSGRbQ2hJZFt1XV1dOwogICAgICAgIGVsc2Ugdj1wYXJbQ2hIZFtDaElkW3ZdXV07CiAgICB9CiAgICBpZihzYXVbdV0+c2F1W3ZdKXJldHVybiB2OwogICAgcmV0dXJuIHU7Cn0KTm9kZSBSZXYoTm9kZSBhKQp7CiAgICByZXR1cm4ge2EuZ3NzLGEubWFSLGEubWFMLGEuc3VtfTsKfQppbnQgUGF0aFF1ZXJ5KGludCB1LGludCB2KQp7CiAgICBpbnQgdz1MQ0EodSx2KTtOb2RlIG1hPXswLDAsMCwwfTsKICAgIHdoaWxlKENoSWRbdV0hPUNoSWRbd10pCiAgICB7CiAgICAgICAgbWE9TWVyZ2UobWEsUmV2KFNlZy0+R2V0KHBvc1tDaEhkW0NoSWRbdV1dXSxwb3NbdV0pKSk7CiAgICAgICAgdT1wYXJbQ2hIZFtDaElkW3VdXV07CiAgICB9CiAgICB2ZWN0b3I8Tm9kZT52ZWM7CiAgICB3aGlsZShDaElkW3ZdIT1DaElkW3ddKQogICAgewogICAgICAgIHZlYy5wdXNoX2JhY2soU2VnLT5HZXQocG9zW0NoSGRbQ2hJZFt2XV1dLHBvc1t2XSkpOwogICAgICAgIHY9cGFyW0NoSGRbQ2hJZFt2XV1dOwogICAgfQogICAgaWYoc2F1W3VdPnNhdVt2XSkKICAgIHsKICAgICAgICBtYT1NZXJnZShtYSxSZXYoU2VnLT5HZXQocG9zW3ZdLHBvc1t1XSkpKTsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgdmVjLnB1c2hfYmFjayhTZWctPkdldChwb3NbdV0scG9zW3ZdKSk7CiAgICB9CiAgICByZXZlcnNlKHZlYy5iZWdpbigpLHZlYy5lbmQoKSk7CiAgICBmb3IoTm9kZSB4OnZlYyltYT1NZXJnZShtYSx4KTsKICAgIHJldHVybiBtYS5nc3M7Cn0Kdm9pZCBQYXRoVXBkYXRlKGludCB1LGludCB2LGludCB4KQp7CiAgICBpbnQgdz1MQ0EodSx2KTsKICAgIHdoaWxlKENoSWRbdV0hPUNoSWRbd10pCiAgICB7CiAgICAgICAgU2VnLT5VcGRhdGUocG9zW0NoSGRbQ2hJZFt1XV1dLHBvc1t1XSx4KTsKICAgICAgICB1PXBhcltDaEhkW0NoSWRbdV1dXTsKICAgIH0KICAgIHdoaWxlKENoSWRbdl0hPUNoSWRbd10pCiAgICB7CiAgICAgICAgU2VnLT5VcGRhdGUocG9zW0NoSGRbQ2hJZFt2XV1dLHBvc1t2XSx4KTsKICAgICAgICB2PXBhcltDaEhkW0NoSWRbdl1dXTsKICAgIH0KICAgIGlmKHNhdVt1XT5zYXVbdl0pc3dhcCh1LHYpOwogICAgU2VnLT5VcGRhdGUocG9zW3VdLHBvc1t2XSx4KTsKfQp2b2lkIFRjbWR1Y19WT0kyNigpCnsKICAgIGNpbj4+bj4+cTtTZWc9bmV3IFNlZ1RyZWUobik7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKyljaW4+PnZhbFtpXTsKICAgIGZvcihpbnQgaT0xO2k8bjtpKyspCiAgICB7CiAgICAgICAgaW50IHUsdjtjaW4+PnU+PnY7CiAgICAgICAgYVt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYVt2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICBERlMoMSk7SExEKDEpOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspU2VnLT5VcGRhdGUocG9zW2ldLHBvc1tpXSx2YWxbaV0pOwogICAgd2hpbGUocS0tKQogICAgewogICAgICAgIGludCB0eXBlLHUsdjtjaW4+PnR5cGU+PnU+PnY7CiAgICAgICAgaWYodHlwZT09MikKICAgICAgICB7CiAgICAgICAgICAgIGludCB4O2Npbj4+eDsKICAgICAgICAgICAgUGF0aFVwZGF0ZSh1LHYseCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgY291dDw8UGF0aFF1ZXJ5KHUsdik8PCdcbic7CiAgICB9Cn0Kc2lnbmVkIG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7aG9tZSgpOwogICAgd2hpbGUoVGVzdC0tKVRjbWR1Y19WT0kyNigpOwogICAgcmV0dXJuIDA7Cn0=