看完第一份题解之后写了一遍,样例过了自信提交,结果WA了,对照了之后找不出错误来QAQ
#include<bits/stdc++.h>
//#define int long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=2e5+7;
int n,q,va[N];
vector<int>G[N];
int sz[N],dep[N],fa[N],son[N],dfn[N],idfn[N],bel[N],idx=0;
void dfs1(int x){
sz[x]=1;
for(auto to:G[x]){
if(to==fa[x]) continue;
fa[to]=x;
dep[to]=dep[x]+1;
dfs1(to);
sz[x]+=sz[to];
if(sz[to]>sz[son[x]]) son[x]=to;
}
}
void dfs2(int x,int tp){
dfn[x]=++idx;
idfn[idx]=x;
bel[x]=tp;
if(son[x]) dfs2(son[x],tp);
for(auto to:G[x]){
if(to==fa[x]||to==son[x]) continue;
dfs2(to,to);
}
}
struct T{
int sum,tg;
int lmx,rmx,mx;
T(){sum=tg=lmx=rmx=mx=0;}
}tr[N<<2];
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((l+r)>>1)
T pushup(T x,T y){
T ans;
ans.sum=x.sum+y.sum;
ans.lmx=max(x.lmx,x.sum+y.lmx);
ans.rmx=max(y.rmx,y.sum+x.rmx);
ans.mx=max(max(x.mx,y.mx),x.rmx+y.lmx);
ans.tg=0;
return ans;
}
void pushdown(int p,int l,int r){
if(tr[p].tg&&l!=r){
int k=tr[p].tg;
tr[ls].tg=tr[rs].tg=k;
tr[ls].sum=(mid-l+1)*k;tr[rs].sum=(r-mid)*k;
tr[ls].mx=tr[ls].lmx=tr[ls].rmx=max(0ll,tr[ls].sum);
tr[rs].mx=tr[rs].lmx=tr[rs].rmx=max(0ll,tr[rs].sum);
tr[p].tg=0;
}
}
void build(int p,int l,int r){
if(l==r){
tr[p].sum=va[idfn[l]];
tr[p].lmx=tr[p].rmx=tr[p].mx=max(tr[p].sum,0ll);
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
tr[p]=pushup(tr[ls],tr[rs]);
}
void modify(int p,int l,int r,int ql,int qr,int k){
if(ql<=l&&r<=qr){
tr[p].sum=(r-l+1)*k;
tr[p].tg=k;
tr[p].lmx=tr[p].rmx=tr[p].mx=max(0ll,tr[p].sum);
return;
}
pushdown(p,l,r);
if(ql<=mid) modify(ls,l,mid,ql,qr,k);
if(qr>mid) modify(rs,mid+1,r,ql,qr,k);
tr[p]=pushup(tr[ls],tr[rs]);
}
T query(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tr[p];
pushdown(p,l,r);
T L,R;
if(ql<=mid) L=query(ls,l,mid,ql,qr);
if(qr>mid) R=query(rs,mid+1,r,ql,qr);
return pushup(L,R);
}
T chainquery(int u,int v){
T L,R;
while(bel[u]!=bel[v]){
if(dep[bel[u]]>dep[bel[v]]){
L=pushup(query(1,1,n,dfn[bel[u]],dfn[u]),L);
u=fa[bel[u]];
}else{
R=pushup(query(1,1,n,dfn[bel[v]],dfn[v]),R);
v=fa[bel[v]];
}
}
if(dep[u]>dep[v]) L=pushup(query(1,1,n,dfn[v],dfn[u]),L);
else R=pushup(query(1,1,n,dfn[u],dfn[v]),R);
swap(L.lmx,L.rmx);
return pushup(L,R);
}
void chainmodify(int u,int v,int w){
while(bel[u]!=bel[v]){
if(dep[bel[u]]<dep[bel[v]]) swap(u,v);
modify(1,1,n,dfn[bel[u]],dfn[u],w);
u=fa[bel[u]];
}
if(dep[u]<dep[v]) swap(u,v);
modify(1,1,n,dfn[v],dfn[u],w);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>va[i];
int u,v,w,op;
for(int i=1;i<n;i++){
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1);
dfs2(1,1);
build(1,1,n);
cin>>q;
while(q--){
cin>>op>>u>>v;
if(op==1){
cout<<(chainquery(u,v).mx)<<"\n";
}else{
cin>>w;
chainmodify(u,v,w);
}
}
return 0;
}