SIGSEGV,代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const ll inf=1145141919810000;
const int N=100005;
void Max(ll& a,const ll& b){ if(a<b) a=b; }
struct Mat{
ll a[3][3];
Mat(ll x=0,int k=1){
a[1][1]=k*x;
if(x<=0) a[0][2]=a[0][1]=a[1][2]=x;
else a[0][2]=a[0][1]=a[1][2]=k*x;
a[0][0]=a[2][2]=0;
a[1][0]=a[2][0]=a[2][1]=-inf;
}
#define _(i,j) r.a[i][j]=max(a[i][0]+o.a[0][j],max(a[i][1]+o.a[1][j],a[i][2]+o.a[2][j]))
Mat operator*(const Mat& o)const{
Mat r;
_(0,0);_(0,1);_(0,2);
_(1,0);_(1,1);_(1,2);
_(2,0);_(2,1);_(2,2);
return r;
}
#undef _
ll ans()const{
return max(max(a[0][0],a[0][1]),a[0][2]);
}
void out()const{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++) cout<<a[i][j]<<"\t";
cout<<"\n";
}
cout<<"\n";
}
};
Mat I;
int n,q;
namespace Cms{
const int N=300005;
int fa[N],ch[N][2],siz[N];
bool iv[N];ll b[N];
Mat a[N],s[N];
#define ls ch[u][0]
#define rs ch[u][1]
#define il inline
il void pushup(int u){
siz[u]=siz[ls]+siz[rs]+1;
s[u]=s[ls]*a[u]*s[rs];
}
il void applyiv(int u){ iv[u]^=1;swap(ls,rs); }
il void applyst(int u,ll x){ b[u]=x;a[u]=Mat(x);s[u]=Mat(x,siz[u]); }
il void pushdown(int u){
if(iv[u]){
iv[u]^=1;
if(ls) applyiv(ls);
if(rs) applyiv(rs);
}
if(b[u]<inf){
if(ls) applyst(ls,b[u]);
if(rs) applyst(rs,b[u]);
b[u]=inf;
}
}
il bool isrt(int u){ return fa[u]==0 || (ch[fa[u]][0]!=u && ch[fa[u]][1]!=u); }
il bool get(int u){ return ch[fa[u]][1]==u; }
void upd(int u){
if(!isrt(u)) upd(fa[u]);
pushdown(u);
}
il void rotate(int u){
int v=fa[u],w=fa[v],c=ch[v][1]==u;
if(!isrt(v)) ch[w][ch[w][1]==v]=u;
ch[v][c]=ch[u][c^1];fa[ch[u][c^1]]=v;
ch[u][c^1]=v;fa[v]=u;fa[u]=w;
pushup(v);pushup(u);
}
il void splay(int u){
upd(u);
for(int f;f=fa[u],!isrt(u);rotate(u)){
if(!isrt(f)) rotate((get(u)==get(f))?f:u);
}
}
il void access(int u){
for(int p=0;u;p=u,u=fa[u]){
splay(u);ch[u][1]=p;pushup(u);
}
}
il void makert(int u){
access(u);splay(u);applyiv(u);
}
il void split(int u,int v){
makert(u);access(v);splay(v);
}
il void link(int u,int v){
makert(u);fa[u]=v;
}
}
using namespace Cms;
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
for(int i=0;i<3;i++) for(int j=0;j<3;j++) I.a[i][j]=-inf;
for(int i=0;i<3;i++) I.a[i][i]=0;
s[0]=I;
cin>>n;
for(int i=1;i<=n;i++){
ll x;cin>>x;a[i]=Mat(x);b[i]=inf;pushup(i);
// cout<<"-- -- "<<i<<" -- --\n";
// a[i].out();s[i].out();
}
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;link(u,v);
}
cin>>q;
while(q--){
int op,x,y;cin>>op>>x>>y;
if(op==1){
split(x,y);
cout<<s[y].ans()<<"\n";
}else{
ll x;cin>>x;
split(x,y);
applyst(y,x);
}
}
// (Mat(-2)*Mat(-3)*Mat(2)*Mat(3)).out();
return 0;
}