rt,record link,是写假了吗?
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int cnt;
long long n,q,a[maxn],mnid[maxn],mxid[maxn],val[maxn];
long long tr[maxn<<2],tg[maxn<<2];
long long hson[maxn],dfn[maxn],h[maxn],f[maxn],sz[maxn],dep[maxn];
vector<vector<int> >e(maxn<<1);
void init(){
h[0]=1;
for(int i=1;i<=n;i++){
h[i]=i;
}
}
void push_up(int num){
tr[num]=tr[num<<1]+tr[num<<1|1];
}
void push_down(int s,int t,int num){
int mid=s+t>>1;
if(tg[num]){
tr[num<<1]=tr[num<<1]+tg[num]*(mid-s+1);
tr[num<<1|1]=tr[num<<1|1]+tg[num]*(t-mid);
tg[num<<1]+=tg[num];
tg[num<<1|1]+=tg[num];
tg[num]=0;
}
}
void buid(int s,int t,int num){
if(s==t){
tr[num]=val[s];
return;
}
int mid=s+t>>1;
buid(s,mid,num<<1);buid(mid+1,t,num<<1|1);
push_up(num);
}
void add(int l,int r,int s,int t,int num,long long x){
if(t<=r && l<=s){
tr[num]=tr[num]+(t-s+1)*x;
tg[num]+=x;
return;
}
push_down(s,t,num);
int mid=s+t>>1;
if(l<=mid) add(l,r,s,mid,num<<1,x);
if(r>mid) add(l,r,mid+1,t,num<<1|1,x);
push_up(num);
}
long long qry(int l,int r,int s,int t,int num){
if(s>=l && t<=r){
return tr[num];
}
int mid=s+t>>1;
long long sum=0;
push_down(s,t,num);
if(l<=mid) sum+=qry(l,r,s,mid,num<<1);
if(r>mid) sum+=qry(l,r,mid+1,t,num<<1|1);
return sum;
}
void dfs1(int x){
int y=0;
for(int v:e[x]){
if(v==f[x]) continue;
dep[v]=dep[x]+1;
f[v]=x;
dfs1(v);
sz[x]+=sz[v];
if(sz[v]>sz[y]) y=v;
}
sz[x]++;
if(sz[x]==0) sz[x]=1;
else hson[x]=y;
}
void dfs2(int x){
dfn[x]=++cnt;
val[cnt]=a[x];
mnid[x]=cnt;
if(hson[x]){
h[hson[x]]=h[x];
dfs2(hson[x]);
}
for(int v:e[x]){
if(v!=hson[x] && v!=f[x]){
dfs2(v);
}
}
}
void Change(int s,int t,long long x){
while(h[s]!=h[t]){
if(dep[h[s]]>dep[h[t]]){
add(dfn[h[s]],dfn[s],1,n,1,x);
s=f[h[s]];
}
else{
add(dfn[h[t]],dfn[t],1,n,1,x);
t=f[h[t]];
}
}
add(min(dfn[s],dfn[t]),max(dfn[s],dfn[t]),1,n,1,x);
}
int main(){
cin>>n;
init();
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dep[0]=1;
dfs1(0);
dfs2(0);
buid(1,n,1);
cin>>q;
for(int i=1;i<=q;i++){
char op;
int x,y,z;
cin>>op;
if(op=='A'){
cin>>x>>y>>z;
Change(x,y,z);
}
else{
cin>>x;
cout<<qry(mnid[x],mnid[x]+sz[x]-1,1,n,1)<<"\n";
}
}
return 0;
}