RT,一直WA
#include<bits/stdc++.h>
using namespace std;
const int MAXN=6e6+5;
struct node
{
int to,nxt;
}e[MAXN];
int head[MAXN],cnt;
inline void add(int x,int y)
{
e[++cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
}
int n,q;
int a[MAXN];
int siz[MAXN],dep[MAXN],hson[MAXN],fa[MAXN];
inline void dfs1(int x,int f)
{
fa[x]=f;
dep[x]=dep[f]+1;
siz[x]=1;
int maxson=-1;
for(register int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(y==f)continue;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>maxson)
{
maxson=siz[y];
hson[x]=y;
}
}
}
int nval[MAXN],top[MAXN],id[MAXN],now;
inline void dfs2(int x,int ltop)
{
id[x]=++now;
nval[now]=a[x];
top[x]=ltop;
if(!hson[x])return;
dfs2(hson[x],ltop);
for(register int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(y==fa[x]||y==hson[x])continue;
dfs2(y,y);
}
}
struct tree
{
int val,sum,ls,rs,ms;
int dat,cov;
}t[MAXN];
inline tree merge(tree a,tree b)
{
tree ans;
ans.sum=(a.sum+b.sum);
ans.ls=max(a.ls,a.sum+b.ls);
ans.rs=max(b.rs,b.sum+a.rs);
ans.ms=max(a.rs+b.ls,max(a.ms,b.ms));
ans.dat=ans.cov=0;
return ans;
}
inline void pushup(int p)
{
t[p]=merge(t[p<<1],t[p<<1|1]);
}
inline void build(int p,int l,int r)
{
if(l==r)
{
t[p].sum=nval[l];
t[p].ls=t[p].rs=t[p].ms=max(t[p].sum,0);
t[p].cov=0;
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
inline void addtag(int p,int l,int r,int k)
{
t[p].sum=(r-l+1)*k;
t[p].ls=t[p].rs=t[p].ms=max(t[p].sum,0);
t[p].cov=1,t[p].dat=k;
}
inline void pushdown(int p,int l,int r)
{
if(t[p].cov)
{
int mid=(l+r)>>1;
addtag(p<<1,l,mid,t[p].dat);
addtag(p<<1|1,mid+1,r,t[p].dat);
t[p].cov=t[p].dat=0;
}
}
inline void change(int p,int l,int r,int a,int b,int k)
{
if(r<a||l>b)return;
if(l>=a&&r<=b)
{
addtag(p,l,r,k);
return;
}
int mid=(l+r)>>1;
pushdown(p,l,r);
change(p<<1,l,mid,a,b,k);
change(p<<1|1,mid+1,r,a,b,k);
pushup(p);
}
inline tree ask(int p,int l,int r,int a,int b)
{
if(l>=a&&r<=b)return t[p];
int mid=(l+r)>>1;
pushdown(p,l,r);
if(b<=mid)return ask(p<<1,l,mid,a,b);
if(mid<a)return ask(p<<1|1,mid+1,r,a,b);
return merge(ask(p<<1,l,mid,a,b),ask(p<<1|1,mid+1,r,a,b));
}
inline void change_ran(int x,int y,int k)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
change(1,1,n,id[top[x]],id[x],k);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
change(1,1,n,id[x],id[y],k);
}
inline tree ask_ran(int x,int y)
{
tree l,r;
while(top[x]!=top[y])
{
if(dep[top[x]]>dep[top[y]])
{
l=merge(ask(1,1,n,id[top[x]],id[x]),l);
x=fa[top[x]];
}
else
{
r=merge(ask(1,1,n,id[top[y]],id[y]),r);
y=fa[top[y]];
}
}
if(dep[x]>dep[y])l=merge(ask(1,1,n,id[y],id[x]),l);
else r=merge(ask(1,1,n,id[x],id[y]),r);
swap(l.ls,l.rs);
return merge(l,r);
}
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(register int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
scanf("%d",&q);
for(register int i=1;i<=q;i++)
{
int op,a,b,c;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&a,&b);
printf("%d\n",ask_ran(a,b).ms);
}
if(op==2)
{
scanf("%d%d%d",&a,&b,&c);
change_ran(a,b,c);
}
}
return 0;
}