错在单点修改时传的是a,应该是id[a](Line 89)。谨记!!!
//fushao zuishuai #include <cstdio> #include <cstring> #include <iostream> #define ll(x) (x<<1) #define rr(x) (x<<1|1) using namespace std; const int N=30010; int w[N],a[N],maxx[N*4],sum[N*4]; int n,m,s[N*2][2],o[N],top[N],son[N],id[N],cnt,siz[N],d[N],f[N],dfn; void jia(int a,int b) {s[++cnt][0]=b;s[cnt][1]=o[a];o[a]=cnt;return;} void shang(int r) {maxx[r]=max(maxx[ll(r)],maxx[rr(r)]);sum[r]=sum[ll(r)]+sum[rr(r)];} void js(int r,int z,int y) { if (z==y) {sum[r]=a[z];maxx[r]=a[z];return;} int k=z+y>>1;js(ll(r),z,k);js(rr(r),k+1,y);shang(r); } void ddxg(int r,int z,int y,int g,int v) { if (z>g||y<g) return; if (z>=g&&y<=g) {sum[r]=v;maxx[r]=v;return;}int k=z+y>>1; ddxg(ll(r),z,k,g,v);ddxg(rr(r),k+1,y,g,v);shang(r); } int cx1(int r,int z,int y,int zz,int yy) { if (z>yy||y<zz) return 0;if (z>=zz&&y<=yy) return sum[r]; int k=z+y>>1;return cx1(ll(r),z,k,zz,yy)+cx1(rr(r),k+1,y,zz,yy); } int cx2(int r,int z,int y,int zz,int yy) { if (z>yy||y<zz) return -3500000;if (z>=zz&&y<=yy) return maxx[r]; int k=z+y>>1;return max(cx2(ll(r),z,k,zz,yy),cx2(rr(r),k+1,y,zz,yy)); } void dfs1(int x,int fa,int dep) { f[x]=fa;d[x]=dep;siz[x]=1; for (int i=o[x];i;i=s[i][1]) if (s[i][0]!=fa) { dfs1(s[i][0],x,dep+1);siz[x]+=siz[s[i][0]]; if (siz[s[i][0]]>siz[son[x]]) son[x]=s[i][0]; } } void dfs2(int x,int tp) { id[x]=++dfn;top[x]=tp;a[dfn]=w[x]; if (son[x]) dfs2(son[x],tp); for (int i=o[x];i;i=s[i][1]) if (s[i][0]!=f[x]&&son[x]!=s[i][0]) dfs2(s[i][0],s[i][0]); } int qiulu2(int a,int b) { int ans=-3e8; while (top[a]!=top[b]) { if (d[top[a]]<d[top[b]]) swap(a,b); ans=max(ans,cx2(1,1,n,id[top[a]],id[a]));a=f[top[a]]; } if (d[a]>d[b]) swap(a,b);ans=max(ans,cx2(1,1,n,id[a],id[b])); return ans; } int qiulu1(int a,int b) { int ans=0; while (top[a]!=top[b]) { if (d[top[a]]<d[top[b]]) swap(a,b); ans+=cx1(1,1,n,id[top[a]],id[a]);a=f[top[a]]; } if (d[a]>d[b]) swap(a,b);ans+=cx1(1,1,n,id[a],id[b]); return ans; } int main() { cin>>n;int a,b,t=n-1;while (t--) {scanf("%d%d",&a,&b);jia(a,b);jia(b,a);} for (int i=1;i<=n;i++) scanf("%d",&w[i]);dfs1(1,0,1);dfs2(1,1);js(1,1,n); cin>>m;char q[20]; while (m--) { scanf("%s",q); if (q[1]=='H') {scanf("%d%d",&a,&b);ddxg(1,1,n,id[a],b);} if (q[1]=='M') {scanf("%d%d",&a,&b);printf("%d ",qiulu2(a,b));} if (q[1]=='S') {scanf("%d%d",&a,&b);printf("%d ",qiulu1(a,b));} } return 0; }