// ROOT : DRAGON3012009 : Wa In Real Life
#include <bits/stdc++.h>
#define ll long long
#define el "\n"
#define _ROOT_ int main()
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000000007
#define MAXN 200001
#define INF (1ll<<60)
#define NAME "file"
#define debug(a) cerr << #a << " = " << a << endl ;
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
ll n, q ;
ll a[MAXN];
ll st[MAXN ], fin[MAXN ], timeDFS ;
ll chainID[MAXN ], chainHead[MAXN ], curChain ;
ll sz[MAXN ], bigchild[MAXN ], par[MAXN ] , high[MAXN ] ;
vector<ll> adj[MAXN ] ;
struct Node
{
ll res, pre, suf, sum, trash ;
};
Node MergeNode(Node a, Node b )
{
if(a.trash ) return b ;
if(b.trash ) return a ;
Node res ;
res.sum = a.sum + b.sum ;
res.pre = max(a.pre, a.sum + b.pre ) ;
res.suf = max(b.suf, a.suf + b.sum ) ;
res.trash = 0 ;
res.res = max({a.res, b.res, a.suf + b.pre, a.sum + b.pre, a.suf + b.sum }) ;
return res ;
}
struct Seg
{
Node val[MAXN << 2 ] ;
void update(ll id, ll l, ll r, ll pos, ll value )
{
if(l == r)
{
ll nv = max(0LL, value ) ;
val[id] = {nv, nv, nv, value, 0 } ;
}
else
{
ll m = l + r >> 1 ;
if(m >= pos ) update(id << 1, l, m, pos, value ) ;
else update(id << 1 | 1, m + 1, r, pos, value ) ;
val[id] = MergeNode(val[id << 1], val[id << 1 | 1 ]) ;
}
}
Node get(ll id, ll l, ll r, ll u, ll v )
{
if(u > r || v < l ) return {1, 1, 1, 1, 1 } ;
if(u <= l && v >= r ) return val[id] ;
ll m = l + r >> 1 ;
return MergeNode(get(id << 1, l, m, u, v ), get(id << 1 | 1, m + 1, r, u, v )) ;
}
} seg ;
void hld(ll u, ll p )
{
if(!chainHead[curChain ]) chainHead[curChain ] = u ;
chainID[u] = curChain ;
st[u] = ++timeDFS ;
if(bigchild[u] != 0 ) hld(bigchild[u] , u ) ;
for(ll v : adj[u] ) if(v != p && v != bigchild[u]) {
curChain ++ ;
hld(v , u ) ;
}
fin[u] = timeDFS ;
}
ll LCA(ll u , ll v ) {
// debug(u) ;
while(chainID[u] != chainID[v]) {
if(chainID[u] > chainID[v]) u = par[chainHead[chainID[u]]] ;
else v = par[chainHead[chainID[v]]] ;
// debug(u ) ;
// debug(v ) ;
}
if(high[u] > high[v]) swap(u , v ) ;
return u ;
}
Node get_path(ll u , ll v ) {
ll lca = LCA(u , v ) ;
Node res ;
res.trash = true ;
vector<Node> L , R ;
while(chainID[u] != chainID[lca ]) {
L.push_back(seg.get(1 , 1 , n , st[chainHead[chainID[u]]] , st[u] )) ;
u = par[chainHead[chainID[u]]] ;
// debug(u) ;
}
while(chainID[v] != chainID[lca ]) {
R.push_back(seg.get(1 , 1 , n , st[chainHead[chainID[v]]] , st[v] )) ;
v = par[chainHead[chainID[v]]] ;
}
if(high[u] <= high[v] ) R.push_back(seg.get(1 , 1 , n , st[u] , st[v]) ) ;
if(high[u] > high[v] ) L.push_back(seg.get(1 , 1 , n , st[v] , st[u]) ) ;
for(Node & it : L ) {
swap(it.pre , it.suf ) ;
}
for(Node & it : L ) res = MergeNode(res , it ) ;
reverse(R.begin() , R.end() ) ;
for(Node & it : R ) res = MergeNode(res , it ) ;
return res ;
}
void dfs(ll u, ll p )
{
sz[u] = 1 ;
ll ma = 0 ;
for(ll v : adj[u]) if(v != p )
{
high[v] = high[u ] + 1 ;
par[v] = u ;
dfs(v, u ) ;
sz[u] += sz[v] ;
if(ma == 0 || sz[ma] < sz[v]) ma = v ;
}
bigchild[u] = ma ;
}
void init()
{
cin >> n >> q ;
FOR(i, 1, n ) cin >> a[i] ;
FOR(i, 2, n )
{
ll x, y ;
cin >> x >> y ;
adj[x].push_back(y) ;
adj[y].push_back(x) ;
}
dfs(1, 1 ) ;
hld(1, 1 ) ;
FOR(i, 1, n ) seg.update(1, 1, n, st[i], a[i]) ;
}
void solve()
{
FOR(cnt , 1 , q ) {
ll t , l , r ; cin >> t >> l >> r ;
if(t == 1 ) seg.update(1 , 1 , n , st[l] , r ) ;
else {
Node res = get_path(l , r ) ;
cout << res.res << el ;
}
}
}
_ROOT_
{
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1; // cin >> t ;
while(t--)
{
init();
solve();
}
return (0&0);
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkgOiBXYSBJbiBSZWFsIExpZmUKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZWwgIlxuIgojZGVmaW5lIF9ST09UXyBpbnQgbWFpbigpCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAyMDAwMDEKI2RlZmluZSBJTkYgKDFsbDw8NjApCiNkZWZpbmUgTkFNRSAiZmlsZSIKI2RlZmluZSBkZWJ1ZyhhKSBjZXJyIDw8ICNhIDw8ICIgPSAiIDw8IGEgPDwgZW5kbCA7CiNkZWZpbmUgY29tcGFyZSh2KSBzb3J0KCh2KS5iZWdpbigpLCAodikuZW5kKCkpOyAodikuZXJhc2UodW5pcXVlKCh2KS5iZWdpbigpLCAodikuZW5kKCkpLCAodikuZW5kKCkpOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBsbCBNT0RbXSA9IHsobGwpMWU5ICsgMjI3NywgKGxsKTFlOSArIDUyNzcsIChsbCkxZTkgKyA4Mjc3LCAobGwpMWU5ICsgOTI3NywgKGxsKSAxZTkgKyA3IH07CmNvbnN0IGxsIE5NT0QgPSAxOwoKbGwgbiwgcSA7CmxsIGFbTUFYTl07CmxsIHN0W01BWE4gXSwgZmluW01BWE4gXSwgdGltZURGUyA7CmxsIGNoYWluSURbTUFYTiBdLCBjaGFpbkhlYWRbTUFYTiBdLCBjdXJDaGFpbiAgOwpsbCBzeltNQVhOIF0sIGJpZ2NoaWxkW01BWE4gXSwgcGFyW01BWE4gXSAsIGhpZ2hbTUFYTiBdIDsKdmVjdG9yPGxsPiBhZGpbTUFYTiBdIDsKCnN0cnVjdCBOb2RlCnsKICAgIGxsIHJlcywgcHJlLCBzdWYsIHN1bSwgdHJhc2ggOwp9OwoKCgpOb2RlIE1lcmdlTm9kZShOb2RlIGEsIE5vZGUgYiApCnsKICAgIGlmKGEudHJhc2ggKSByZXR1cm4gYiA7CiAgICBpZihiLnRyYXNoICkgcmV0dXJuIGEgOwogICAgTm9kZSByZXMgOwogICAgcmVzLnN1bSA9IGEuc3VtICsgYi5zdW0gOwogICAgcmVzLnByZSA9IG1heChhLnByZSwgYS5zdW0gKyBiLnByZSApIDsKICAgIHJlcy5zdWYgPSBtYXgoYi5zdWYsIGEuc3VmICsgYi5zdW0gKSA7CiAgICByZXMudHJhc2ggPSAwIDsKICAgIHJlcy5yZXMgPSBtYXgoe2EucmVzLCBiLnJlcywgYS5zdWYgKyBiLnByZSwgYS5zdW0gKyBiLnByZSwgYS5zdWYgKyBiLnN1bSB9KSA7CiAgICByZXR1cm4gcmVzIDsKfQoKc3RydWN0IFNlZwp7CiAgICBOb2RlIHZhbFtNQVhOIDw8IDIgXSA7CiAgICB2b2lkIHVwZGF0ZShsbCBpZCwgbGwgbCwgbGwgciwgbGwgcG9zLCBsbCB2YWx1ZSApCiAgICB7CiAgICAgICAgaWYobCA9PSByKQogICAgICAgIHsKICAgICAgICAgICAgbGwgbnYgPSBtYXgoMExMLCB2YWx1ZSApIDsKICAgICAgICAgICAgdmFsW2lkXSA9IHtudiwgbnYsIG52LCB2YWx1ZSwgMCB9IDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbGwgbSA9IGwgKyByID4+IDEgOwogICAgICAgICAgICBpZihtID49IHBvcyApIHVwZGF0ZShpZCA8PCAxLCBsLCBtLCBwb3MsIHZhbHVlICkgOwogICAgICAgICAgICBlbHNlIHVwZGF0ZShpZCA8PCAxIHwgMSwgbSArIDEsIHIsICBwb3MsIHZhbHVlICkgOwogICAgICAgICAgICB2YWxbaWRdID0gTWVyZ2VOb2RlKHZhbFtpZCA8PCAxXSwgdmFsW2lkIDw8IDEgfCAxIF0pIDsKICAgICAgICB9CiAgICB9CiAgICBOb2RlIGdldChsbCBpZCwgbGwgbCwgbGwgciwgbGwgdSwgbGwgdiApCiAgICB7CiAgICAgICAgaWYodSA+IHIgfHwgdiA8IGwgKSByZXR1cm4gezEsIDEsIDEsIDEsIDEgfSA7CiAgICAgICAgaWYodSA8PSBsICYmIHYgPj0gciApIHJldHVybiB2YWxbaWRdIDsKICAgICAgICBsbCBtID0gbCArIHIgPj4gMSA7CiAgICAgICAgcmV0dXJuIE1lcmdlTm9kZShnZXQoaWQgPDwgMSwgbCwgbSwgdSwgdiApLCBnZXQoaWQgPDwgMSB8IDEsIG0gKyAxLCByLCB1LCB2ICkpIDsKICAgIH0KfSBzZWcgOwoKdm9pZCBobGQobGwgdSwgbGwgcCApCnsKICAgIGlmKCFjaGFpbkhlYWRbY3VyQ2hhaW4gXSkgY2hhaW5IZWFkW2N1ckNoYWluIF0gPSB1IDsKICAgIGNoYWluSURbdV0gPSBjdXJDaGFpbiA7CiAgICBzdFt1XSA9ICsrdGltZURGUyA7CiAgICBpZihiaWdjaGlsZFt1XSAhPSAwICkgaGxkKGJpZ2NoaWxkW3VdICwgdSApIDsKCiAgICBmb3IobGwgdiA6IGFkalt1XSApIGlmKHYgIT0gcCAmJiB2ICE9IGJpZ2NoaWxkW3VdKSB7CiAgICAgICAgY3VyQ2hhaW4gKysgOwogICAgICAgIGhsZCh2ICwgdSAgICkgOwogICAgfQoKICAgIGZpblt1XSA9IHRpbWVERlMgOwp9CgpsbCBMQ0EobGwgdSAsIGxsIHYgKSB7Ci8vICAgIGRlYnVnKHUpIDsKd2hpbGUoY2hhaW5JRFt1XSAhPSBjaGFpbklEW3ZdKSB7CiAgICBpZihjaGFpbklEW3VdID4gY2hhaW5JRFt2XSkgdSA9IHBhcltjaGFpbkhlYWRbY2hhaW5JRFt1XV1dIDsKICAgIGVsc2UgdiA9IHBhcltjaGFpbkhlYWRbY2hhaW5JRFt2XV1dIDsKLy8gICAgZGVidWcodSApIDsKLy8gICAgZGVidWcodiApIDsKfQppZihoaWdoW3VdID4gaGlnaFt2XSkgc3dhcCh1ICwgdiApIDsKcmV0dXJuIHUgOwp9CgpOb2RlIGdldF9wYXRoKGxsIHUgLCBsbCB2ICkgewogICAgbGwgbGNhID0gTENBKHUgLCB2ICkgOwogICAgTm9kZSByZXMgOwogICAgcmVzLnRyYXNoID0gdHJ1ZSA7CiAgICB2ZWN0b3I8Tm9kZT4gTCAsIFIgOwoKICAgIHdoaWxlKGNoYWluSURbdV0gIT0gY2hhaW5JRFtsY2EgXSkgewogICAgICAgIEwucHVzaF9iYWNrKHNlZy5nZXQoMSAsIDEgLCBuICwgc3RbY2hhaW5IZWFkW2NoYWluSURbdV1dXSAsIHN0W3VdICkpIDsKICAgICAgICB1ID0gcGFyW2NoYWluSGVhZFtjaGFpbklEW3VdXV0gOwovLyAgICAgICAgZGVidWcodSkgOwogICAgfQoKICAgIHdoaWxlKGNoYWluSURbdl0gIT0gY2hhaW5JRFtsY2EgXSkgewogICAgICAgIFIucHVzaF9iYWNrKHNlZy5nZXQoMSAsIDEgLCBuICwgc3RbY2hhaW5IZWFkW2NoYWluSURbdl1dXSAsIHN0W3ZdICkpIDsKICAgICAgICB2ID0gcGFyW2NoYWluSGVhZFtjaGFpbklEW3ZdXV0gOwogICAgfQoKICAgIGlmKGhpZ2hbdV0gPD0gaGlnaFt2XSApIFIucHVzaF9iYWNrKHNlZy5nZXQoMSAsIDEgLCBuICwgc3RbdV0gLCBzdFt2XSkgKSA7CiAgICBpZihoaWdoW3VdID4gaGlnaFt2XSApIEwucHVzaF9iYWNrKHNlZy5nZXQoMSAsIDEgLCBuICwgc3Rbdl0gLCBzdFt1XSkgKSA7CiAgICBmb3IoTm9kZSAmIGl0IDogTCApIHsKICAgICAgICBzd2FwKGl0LnByZSAsIGl0LnN1ZiApIDsKICAgIH0KICAgIGZvcihOb2RlICYgaXQgOiBMICkgcmVzID0gTWVyZ2VOb2RlKHJlcyAsIGl0ICkgOwogICAgcmV2ZXJzZShSLmJlZ2luKCkgLCBSLmVuZCgpICkgOwogICAgZm9yKE5vZGUgJiBpdCA6IFIgKSByZXMgPSBNZXJnZU5vZGUocmVzICwgaXQgKSA7CiAgICByZXR1cm4gcmVzIDsKfQoKdm9pZCBkZnMobGwgdSwgbGwgcCApCnsKICAgIHN6W3VdID0gMSA7CiAgICBsbCBtYSA9IDAgOwogICAgZm9yKGxsIHYgOiBhZGpbdV0pIGlmKHYgIT0gcCApCiAgICAgICAgewogICAgICAgICAgICBoaWdoW3ZdID0gaGlnaFt1ICBdICsgMSAgOwogICAgICAgICAgICBwYXJbdl0gPSB1IDsKICAgICAgICAgICAgZGZzKHYsIHUgKSA7CiAgICAgICAgICAgIHN6W3VdICs9IHN6W3ZdIDsKICAgICAgICAgICAgaWYobWEgPT0gMCB8fCBzelttYV0gPCBzelt2XSkgbWEgPSB2IDsKICAgICAgICB9CiAgICBiaWdjaGlsZFt1XSA9IG1hIDsKfQoKdm9pZCBpbml0KCkKewogICAgY2luID4+IG4gPj4gcSA7CiAgICBGT1IoaSwgMSwgbiApIGNpbiA+PiBhW2ldIDsKICAgIEZPUihpLCAyLCBuICkKICAgIHsKICAgICAgICBsbCB4LCB5IDsKICAgICAgICBjaW4gPj4geCA+PiB5IDsKICAgICAgICBhZGpbeF0ucHVzaF9iYWNrKHkpIDsKICAgICAgICBhZGpbeV0ucHVzaF9iYWNrKHgpIDsKICAgIH0KICAgIGRmcygxLCAxICkgOwogICAgaGxkKDEsIDEgICkgOwogICAgRk9SKGksIDEsIG4gKSBzZWcudXBkYXRlKDEsIDEsIG4sIHN0W2ldLCBhW2ldKSA7Cn0KCnZvaWQgc29sdmUoKQp7CiAgICBGT1IoY250ICwgMSAsIHEgKSB7CiAgICBsbCB0ICwgbCAsIHIgOyBjaW4gPj4gdCA+PiBsID4+IHIgOwogICAgaWYodCA9PSAxICkgc2VnLnVwZGF0ZSgxICwgMSAsIG4gLCBzdFtsXSAsIHIgKSA7CiAgICBlbHNlIHsKICAgICAgICBOb2RlIHJlcyA9IGdldF9wYXRoKGwgLCByICkgOwogICAgICAgIGNvdXQgPDwgcmVzLnJlcyA8PCBlbCA7CiAgICB9CiAgICB9Cn0KCl9ST09UXwp7CiAgICAvLyBmcmVvcGVuKE5BTUUiLmlucCIgLCAiciIgLCBzdGRpbik7CiAgICAvLyBmcmVvcGVuKE5BTUUiLm91dCIgLCAidyIsIHN0ZG91dCkgOwogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CiAgICBjb3V0LnRpZSgwKTsKICAgIGludCB0ID0gMTsgLy8gY2luID4+IHQgOwogICAgd2hpbGUodC0tKQogICAgewogICAgICAgIGluaXQoKTsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgcmV0dXJuICgwJjApOwp9Cg==