我已经无能为力了,输入边的时候re了
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void output(int x){
if(x<0){
putchar('-');
x=abs(x);
}
if(x<10){
putchar(x+'0');
return ;
}
output(x/10);
putchar('0'+x%10);
}
int first[1000001],nxd[1000001],to[1000001],cnt;
int dfn[1000001],top[1000001],son[1000001],dep[1000001],siz[1000001],f[1000001],ncnt,ww[524289],w[100001];
int ma[524289],mi[524289],val[2][524289],tag[524289];
void dfs1(int x,int fa,int deep){
f[x]=fa;
dep[x]=deep;
siz[x]=1;
for(int i=first[x];i;i=nxd[i]){
if(to[i]!=fa){
dfs1(to[i],x,deep+1);
siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]]){
son[x]=to[i];
}
}
}
}
void dfs2(int x,int t){
top[x]=t;
ncnt++;
dfn[x]=ncnt;
ww[ncnt]=w[x];
if(son[x]==0){
return ;
}
dfs2(son[x],t);
for(int i=first[x];i;i=nxd[i]){
if(to[i]!=f[x]&&to[i]!=son[x]){
dfs2(to[i],to[i]);
}
}
}
void push_up(int id){
ma[id]=max(ma[id<<1],ma[id<<1|1]);
mi[id]=min(mi[id<<1],mi[id<<1|1]);
val[0][id]=max(max(val[0][id<<1],val[0][id<<1|1]),ma[id<<1|1]-mi[id<<1]);
val[1][id]=max(max(val[1][id<<1],val[1][id<<1|1]),ma[id<<1]-mi[id<<1|1]);
}
void tags(int id,int sum){
ma[id]+=sum;
mi[id]+=sum;
tag[id]+=sum;
}
void push_down(int id){
if(tag[id]==0) return ;
tags(id<<1,tag[id]);
tags(id<<1|1,tag[id]);
tag[id]=0;
}
void build(int id,int l,int r){
if(l==r){
ma[id]=mi[id]=ww[l];
val[0][id]=val[1][id]=0;
return ;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
push_up(id);
}
void modify(int id,int l,int r,int L,int R,int val){
if(L<=l&&r<=R){
tags(id,val);
return ;
}
push_down(id);
int mid=(l+r)>>1;
if(L<=mid) modify(id<<1,l,mid,L,R,val);
if(mid<R) modify(id<<1|1,mid+1,r,L,R,val);
push_up(id);
}
int findmin(int id,int l,int r,int L,int R){
if(L*R==0){
return INT_MAX;
}
if(L<=l&&r<=R){
return mi[id];
}
push_down(id);
int mid=(l+r)>>1,ans=INT_MAX;
if(L<=mid) ans=min(ans,findmin(id<<1,l,mid,L,R));
if(mid<R) ans=min(ans,findmin(id<<1|1,mid+1,r,L,R));
return ans;
}
int findmax(int id,int l,int r,int L,int R){
if(L*R==0){
return INT_MIN;
}
if(L<=l&&r<=R){
return ma[id];
}
push_down(id);
int mid=(l+r)>>1,ans=INT_MIN;
if(L<=mid) ans=max(ans,findmax(id<<1,l,mid,L,R));
if(mid<R) ans=max(ans,findmax(id<<1|1,mid+1,r,L,R));
return ans;
}
int findsum(int id,int l,int r,int L,int R,int x){
if(L*R==0){
return 0;
}
if(L<=l&&r<=R){
return val[x][id];
}
push_down(id);
int mid=(l+r)>>1,ans=0;
if(L<=mid){
ans=findsum(id<<1,l,mid,L,R,x);
}
if(mid<R){
ans=max(ans,findsum(id<<1|1,mid+1,r,L,R,x));
}
if(L<=mid&&mid<R){
if(x==0) ans=max(ans,findmax(1,1,131072,mid+1,R)-findmin(1,1,131072,L,mid));
else ans=max(ans,findmax(1,1,131072,L,mid)-findmin(1,1,131072,mid+1,R));
}
return ans;
}
int path(int x,int y){
int xton=INT_MAX,yton=INT_MIN,xret=0,yret=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
if(xton==INT_MAX){
xret=max(xret,findsum(1,1,131072,dfn[top[x]],dfn[x],1));
xton=findmin(1,1,131072,dfn[top[x]],dfn[x]);
}
else{
xret=max(xret,max(findsum(1,1,131072,dfn[top[x]],dfn[x],1),findmax(1,1,131072,dfn[top[x]],dfn[x])-xton));
xton=min(xton,findmin(1,1,131072,dfn[top[x]],dfn[x])-xton);
}
x=f[top[x]];
}
else{
if(yton==INT_MIN){
yret=max(yret,findsum(1,1,131072,dfn[top[y]],dfn[y],0));
yton=findmax(1,1,131072,dfn[top[y]],dfn[y]);
}
else{
yret=max(yret,max(findsum(1,1,131072,dfn[top[y]],dfn[y],0),yton-findmin(1,1,131072,dfn[top[y]],dfn[y])));
yton=max(yton,findmax(1,1,131072,dfn[top[y]],dfn[y]));
}
y=f[top[y]];
}
}
if(xton==INT_MAX&&yton==INT_MIN){
if(dep[x]>dep[y]){
return findsum(1,1,131072,dfn[y],dfn[x],1);
}
else{
return findsum(1,1,131072,dfn[x],dfn[y],0);
}
}
else if(xton==INT_MAX){
if(dep[x]>dep[y]){
xret=findsum(1,1,131072,dfn[y],dfn[x],1);
xton=findmin(1,1,131072,dfn[y],dfn[x]);
}
else{
xret=findsum(1,1,131072,dfn[x],dfn[y],0);
xton=findmin(1,1,131072,dfn[x],dfn[y]);
}
}
else if(yton==INT_MIN){
if(dep[x]>dep[y]){
yret=findsum(1,1,131072,dfn[x],dfn[y],1);
yton=findmin(1,1,131072,dfn[x],dfn[y]);
}
else{
yret=findsum(1,1,131072,dfn[x],dfn[y],0);
yton=findmax(1,1,131072,dfn[x],dfn[y]);
}
}
else if(dep[x]>dep[y]){
xret=max(xret,max(findsum(1,1,131072,dfn[y],dfn[x],1),findmax(1,1,131072,dfn[y],dfn[x])-xton));
xton=min(xton,findmin(1,1,131072,dfn[y],dfn[x]));
}
else{
yret=max(yret,max(findsum(1,1,131072,dfn[x],dfn[y],0),yton-findmin(1,1,131072,dfn[x],dfn[y])));
yton=max(yton,findmax(1,1,131072,dfn[x],dfn[y]));
}
int answer=max(max(xret,yret),yton-xton);
return answer;
}
void addd(int x,int y,int k){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
modify(1,1,131072,dfn[top[x]],dfn[x],k);
x=f[top[x]];
}
if(dep[x]>dep[y]){
swap(x,y);
}
modify(1,1,131072,dfn[x],dfn[y],k);
}
int adds(int u,int v){
to[++cnt]=v;
nxd[cnt]=first[u];
first[u]=cnt;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>w[i];
}
int u,v;
for(int i=1;i<n;i++){
cin>>u>>v;
adds(u,v);
adds(v,u);
}
dfs1(1,0,1);
dfs2(1,1);
build(1,1,131072);
int Q;
cin>>Q;
for(int i=1,l,r,v;i<=Q;i++){
cin>>l>>r>>v;
cout<<path(l,r);
puts("");
addd(l,r,v);
}
return 0;
}