50分wa2 7 8 9 10
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline 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-48;ch=getchar();}
return x*f;
}
int n,q,b[500500],id[500500],fa[500500],dep[500500],son[500500];
int siz[500500],top[500500],cnt,a[500500];
vector<int>vec[550500];
struct node{
int l,r,sum,tag;
}tr[500500<<2];
void dfs1(int u,int f){
dep[u]=dep[f]+1;
son[u]=0;siz[u]=1;
for(auto v:vec[u]){
if(v==f) continue;
fa[v]=u;dfs1(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v])son[u]=v;
}
}
void dfs2(int u,int tp){
top[u]=tp;id[u]=++cnt;
if(son[u]!=0) dfs2(son[u],tp);
for(auto v:vec[u]){
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
}
void push_up(int k){
tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}
void build(int k,int l,int r){
tr[k].l=l;tr[k].r=r;
if(l==r){tr[k].sum=0;return;}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
push_up(k);
}
void push_down(int k){
tr[k<<1].tag+=tr[k].tag;
tr[k<<1|1].tag+=tr[k].tag;
tr[k<<1].sum+=tr[k].tag*(tr[k<<1].r-tr[k<<1].l+1);
tr[k<<1|1].sum+=tr[k].tag*(tr[k<<1|1].r-tr[k<<1|1].l+1);
tr[k].tag=0;
}
void add(int k,int l,int r,int v){
if(l<=tr[k].l&&tr[k].r<=r){
tr[k].sum+=v*(tr[k].r-tr[k].l+1);
tr[k].tag+=v;
return;
}
push_down(k);
int mid=(tr[k].l+tr[k].r)>>1;
if(l<=mid) add(k<<1,l,r,v);
if(r>mid)add(k<<1|1,l,r,v);
push_up(k);
}
void change(int x,int y,int v){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
add(1,id[top[x]],id[x],v);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
add(1,id[x],id[y],v);
}
int sum(int k,int l,int r){
int ans=0;
if(l<=tr[k].l&&tr[k].r<=r){
return tr[k].sum;
}
push_down(k);
int mid=(tr[k].l+tr[k].r)>>1;
if(l<=mid)ans+=sum(k<<1,l,r);
if(mid<r) ans+=sum(k<<1|1,l,r);
return ans;
}
int ask(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans+=sum(1,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans+=sum(1,id[x],id[y]);
return ans;
}
signed main(){
n=read();
int x,y,z;
for(int i=1;i<n;i++){
x=read()+1;y=read()+1;
vec[x].push_back(y);
vec[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,cnt);
q=read();
char c;
while(q--){
cin>>c;
if(c=='Q'){
x=read()+1;
printf("%lld\n",ask(id[x],id[x]+siz[x]-1));
}
else if(c=='A'){
x=read()+1;y=read()+1;z=read();
change(x,y,z);
}
}
return 0;
}
```cpp