树剖,只有10分,还RE了7个,求大佬看看有什么问题,思路对不对
#include<iostream>
#include<vector>
using namespace std;
vector<int>e[100005];
struct Tree{
long long maxx,minn,max1/*l~r*/,max2/*r~l*/,o;
}t[100005];
long long f[100005],son[100005],w[100005],wd[100005],id[100005],siz[100005],top[100005],dep[100005],cnt;
void dfs1(long long x,long long fa){
f[x]=fa;
dep[x]=dep[fa]+1;
siz[x]=1;
for(long long i=0;i<e[x].size();i++){
if(e[x][i]!=fa){
dfs1(e[x][i],x);
if(siz[e[x][i]]>siz[son[x]])son[x]=e[x][i];
siz[x]+=siz[e[x][i]];
}
}
}
void dfs2(long long x,long long tp){
top[x]=tp;
cnt++;
id[x]=cnt;
wd[cnt]=w[x];
if(!son[x])return;
dfs2(son[x],tp);
for(long long i=0;i<e[x].size();i++){
if(e[x][i]!=f[x]&&e[x][i]!=son[x]){
dfs2(e[x][i],e[x][i]);
}
}
}
void push_up(long long z,int l,int r){
t[z].minn=min(t[z<<1].minn,t[z<<1|1].minn);
t[z].maxx=max(t[z<<1].maxx,t[z<<1|1].maxx);
t[z].max1=max(t[z<<1].max1,max(t[z<<1|1].max1,t[z<<1|1].maxx-t[z<<1].minn));
t[z].max2=max(t[z<<1].max2,max(t[z<<1|1].max2,t[z<<1].maxx-t[z<<1|1].minn));
}
void build(long long l,long long r,long long z){
if(l==r){
t[z].minn=wd[l];
t[z].maxx=wd[l];
return;
}
long long mid=(l+r)>>1;
build(l,mid,z<<1);
build(mid+1,r,z<<1|1);
push_up(z,l,r);
}
void push_down(long long z){
if(t[z].o){
t[z<<1].o+=t[z].o;
t[z<<1|1].o+=t[z].o;
t[z<<1].maxx+=t[z].o;
t[z<<1|1].maxx+=t[z].o;
t[z<<1].minn+=t[z].o;
t[z<<1|1].minn+=t[z].o;
t[z].o=0;
}
}
void xg(long long l,long long r,long long x,long long y,long long z,long long k){
if(l<=x&&y<=r){
t[z].o+=k;
t[z].minn+=k;
t[z].maxx+=k;
return;
}
push_down(z);
long long mid=(x+y)>>1;
if(mid>=l)xg(l,r,x,mid,z<<1,k);
if(mid<r)xg(l,r,mid+1,y,z<<1|1,k);
}
long long jc(long long l,long long r,long long x,long long z){
if(l==r&&l==x){
return t[z].minn;
}
push_down(z);
long long mid=(l+r)>>1;
if(mid>=x)return jc(l,mid,x,z<<1);
else return jc(mid+1,r,x,z<<1|1);
}
Tree cx(long long l,long long r,long long x,long long y,long long z){
if(l<=x&&y<=r){
return t[z];
}
push_down(z);
push_up(z,x,y);
long long mid=(x+y)>>1;
if(mid>=l&&mid<r){
Tree a=cx(l,r,x,mid,z<<1);//l
Tree b=cx(l,r,mid+1,y,z<<1|1);//r
Tree ans;
ans.maxx=max(a.maxx,b.maxx);
ans.minn=min(a.minn,b.minn);
ans.max1=max(a.max1,max(b.max1,b.maxx-a.minn));
ans.max2=max(a.max2,max(b.max2,a.maxx-b.minn));
return ans;
}
else if(mid>=l)return cx(l,r,x,mid,z<<1);
else if(mid<r)return cx(l,r,mid+1,y,z<<1|1);
}
void lcaxg(long long x,long long y,long long k){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
xg(id[top[x]],id[x],1,cnt,1,k);
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
xg(id[x],id[y],1,cnt,1,k);
}
long long lcacx(long long x,long long y){
long long qd=x,zd=y;//起点,终点
Tree zuo,you;
//不是左右,只是想象成左是开头右是结尾,(不要在意变量名)
zuo.max1=zuo.max2=zuo.maxx=you.max1=you.max2=you.maxx=0;
zuo.minn=you.minn=99999999;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
Tree a=cx(id[top[x]],id[x],1,cnt,1);
if(x==qd){
if(!zuo.maxx)zuo=a;
else{
zuo.max2=max(a.max2,max(zuo.max2,a.maxx-zuo.minn));
zuo.maxx=max(a.maxx,zuo.maxx);
zuo.minn=min(a.minn,zuo.minn);
}
qd=f[top[x]];
}
else{
if(!you.maxx)you=a;
else{
you.max1=max(a.max1,max(you.max1,you.maxx-a.minn));
you.maxx=max(a.maxx,you.maxx);
you.minn=min(a.minn,you.minn);
}
zd=f[top[x]];
}
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
Tree a=cx(id[x],id[y],1,cnt,1);
// cout<<a.max1<<" "<<a.max2<<"\n";
if(x!=qd){
if(!zuo.maxx)zuo=a;
else{
zuo.max2=max(a.max2,max(zuo.max2,a.maxx-zuo.minn));
zuo.maxx=max(a.maxx,zuo.maxx);
zuo.minn=min(a.minn,zuo.minn);
}
return max(zuo.max2,max(you.max1,you.maxx-zuo.minn));
}
else{
if(!you.maxx)you=a;
else{
you.max1=max(a.max1,max(you.max1,you.maxx-a.minn));
you.maxx=max(a.maxx,you.maxx);
you.minn=min(a.minn,you.minn);
}
return max(zuo.max2,max(you.max1,you.maxx-zuo.minn));
}
}
int main(){
long long n;
cin>>n;
for(long long i=1;i<=n;i++)cin>>w[i];
for(long long i=1;i<n;i++){
long long x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
build(1,n,1);
long long q;
cin>>q;
for(long long i=1;i<=q;i++){
long long a,b,u;
cin>>a>>b>>u;
lcaxg(a,b,u);
cout<<lcacx(a,b)<<"\n";
}
return 0;
}