#define PROBLEM "https://judge.yosupo.jp/problem/dynamic_tree_vertex_add_path_sum"
#include"src/contest/template.hpp"
#include"src/tree/link-cut-tree.hpp"constintN=2e5+5;intn,q;lla[N];LinkCutTree<N,ll>lct;intmain(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>q;for(inti=1;i<=n;i++){cin>>a[i];lct.set(i,a[i]);}for(inti=0;i<n-1;i++){intu,v;cin>>u>>v;u++,v++;lct.link(u,v);}while(q--){intop;cin>>op;if(op==0){intu,v,x,y;cin>>u>>v>>x>>y;u++,v++,x++,y++;lct.cut(u,v);lct.link(x,y);}elseif(op==1){intu,x;cin>>u>>x;u++;lct.set(u,a[u]+=x);}else{intu,v;cin>>u>>v;u++,v++;cout<<lct.aggregate(u,v)<<"\n";}}}
#line 1 "verify/tree/link-cut-tree/dynamic_tree_vertex_add_path_sum.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/dynamic_tree_vertex_add_path_sum"
#line 2 "src/contest/template.hpp"
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>usingnamespacestd;usingnamespace__gnu_pbds;usingll=longlong;usingdb=longdouble;usingvi=vector<int>;usingvl=vector<ll>;usingvd=vector<db>;usingpii=pair<int,int>;usingpll=pair<ll,ll>;usingpdd=pair<db,db>;constintINF=0x3fffffff;constllLINF=0x1fffffffffffffff;constdbDINF=numeric_limits<db>::infinity();constdbEPS=1e-9;constdbPI=acos(db(-1));template<classT>usingordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());mt19937_64rng64(chrono::steady_clock::now().time_since_epoch().count());#line 2 "src/tree/link-cut-tree.hpp"
/**
* Author: Teetat T.
* Description: Link Cut Tree (1-indexed)
*/template<intN,classT>structLinkCutTree{intch[N][2],par[N],lz[N],rev[N];Tval[N],sum[N],rsum[N];voidtoggle(intv){if(!v)return;swap(ch[v][0],ch[v][1]);swap(sum[v],rsum[v]);rev[v]^=1;}voidpush(intv){if(!v||!rev[v])return;toggle(ch[v][0]);toggle(ch[v][1]);rev[v]=0;}voidpull(intv){if(!v)return;sum[v]=sum[ch[v][0]]+val[v]+sum[ch[v][1]];rsum[v]=rsum[ch[v][0]]+val[v]+rsum[ch[v][1]];}boolis_root(intv){returnch[par[v]][0]!=v&&ch[par[v]][1]!=v;}boolpos(intv){returnch[par[v]][1]==v;}voidrotate(intv){intu=par[v],g=par[u];boolx=pos(v);if(!is_root(u))ch[g][pos(u)]=v;ch[u][x]=ch[v][!x];if(ch[u][x])par[ch[u][x]]=u;ch[v][!x]=u,par[u]=v,par[v]=g;pull(u),pull(v);}voidsplay(intv){if(!v)return;for(push(v);!is_root(v);rotate(v)){intu=par[v];if(is_root(u))push(u),push(v);elsepush(par[u]),push(u),push(v),rotate(pos(u)==pos(v)?u:v);}}voidaccess(intv){for(intu=v,c=0;u;u=par[u]){splay(u);ch[u][1]=c;pull(c=u);}splay(v);}voidevert(intv){access(v),toggle(v);}voidlink(intu,intv){evert(u);access(v);par[u]=v;}voidcut(intu,intv){evert(u);access(v);assert(par[u]==v);ch[v][0]=par[u]=0;pull(v);}Taggregate(intu,intv){evert(u);access(v);returnsum[v];}voidset(intu,Tv){evert(u);val[u]=v;pull(u);}};#line 4 "verify/tree/link-cut-tree/dynamic_tree_vertex_add_path_sum.test.cpp"
constintN=2e5+5;intn,q;lla[N];LinkCutTree<N,ll>lct;intmain(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>q;for(inti=1;i<=n;i++){cin>>a[i];lct.set(i,a[i]);}for(inti=0;i<n-1;i++){intu,v;cin>>u>>v;u++,v++;lct.link(u,v);}while(q--){intop;cin>>op;if(op==0){intu,v,x,y;cin>>u>>v>>x>>y;u++,v++,x++,y++;lct.cut(u,v);lct.link(x,y);}elseif(op==1){intu,x;cin>>u>>x;u++;lct.set(u,a[u]+=x);}else{intu,v;cin>>u>>v;u++,v++;cout<<lct.aggregate(u,v)<<"\n";}}}