rt
目测不是数组大小的问题
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
//#define LL_inf 1145141919810
#define ull unsigned long long
#define ll long long
using namespace std;
#define int long long
const int Maxn=5e5+10;
int head[Maxn],tot;
struct Edge{
int to;
int nxt;
}E[Maxn<<1];
void addedge(int u,int v)
{
tot++;
E[tot].to=v;
E[tot].nxt=head[u];
head[u]=tot;
}
int n;
int dep[Maxn],siz[Maxn],fa[Maxn],son[Maxn],tp[Maxn],dfn[Maxn],cnt;
void dfs1(int u,int f)
{
dep[u]=dep[f]+1;
siz[u]=1;
fa[u]=f;
int maxson=-1;
for(int i=head[u];i!=-1;i=E[i].nxt)
{
int v=E[i].to;
if(v!=f)
{
dfs1(v,u);
siz[u]+=siz[v];
if(maxson<siz[v])
{
maxson=siz[v];
son[u]=v;
}
}
}
}
void dfs2(int u,int Top)
{
tp[u]=Top;
dfn[u]=++cnt;
if(!son[u])
{
return ;
}
dfs2(son[u],Top);
for(int i=head[u];i!=-1;i=E[i].nxt)
{
int v=E[i].to;
if(v==fa[u] || v==son[u])
{
return ;
}
dfs2(v,v);
}
}
struct SegTree{
#define ls (node<<1)
#define rs (node<<1|1)
int tag[Maxn<<2];
int sum[Maxn<<2];
void pushup(int node)
{
sum[node]=sum[ls]+sum[rs];
}
void pushdown(int node,int l,int r)
{
if(tag[node]!=0)
{
int len=r-l+1;
tag[ls]+=tag[node];
sum[ls]+=tag[node]*(len-(len>>1));
tag[rs]+=tag[node];
sum[rs]+=tag[node]*(len>>1);
tag[node]=0;
}
}
void build(int node,int l,int r)
{
if(l==r)
{
sum[node]=0;
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(node);
}
void update(int node,int l,int r,int qL,int qR,int val)
{
if(qL<=l && r<=qR)
{
sum[node]+=(r-l+1)*val;
tag[node]+=val;
return ;
}
int mid=(l+r)>>1;
pushdown(node,l,r);
if(qL<=mid) update(ls,l,mid,qL,qR,val);
if(qR>mid) update(rs,mid+1,r,qL,qR,val);
pushup(node);
}
int query(int node,int l,int r,int qL,int qR)
{
if(qL<=l && r<=qR)
{
return sum[node];
}
int mid=(l+r)>>1;
int res=0;
pushdown(node,l,r);
if(qL<=mid) res+=query(ls,l,mid,qL,qR);
if(qR>mid) res+=query(rs,mid+1,r,qL,qR);
return res;
}
}segtree;
int querysubtree(int u)
{
return segtree.query(1,1,n,dfn[u],dfn[u]+siz[u]-1);
}
void modifyEdge(int u,int v,int val)
{
while(tp[u]!=tp[v])
{
if(dep[tp[u]]<dep[tp[v]])
{
swap(u,v);
}
segtree.update(1,1,n,dfn[tp[u]],dfn[u],val);
u=fa[tp[u]];
}
if(dep[u]>dep[v])
{
swap(u,v);
}
segtree.update(1,1,n,dfn[u],dfn[v],val);
}
signed main()
{
memset(head,-1,sizeof(head));
scanf("%lld",&n);
for(int i=1;i<n;i++)
{
int u,v;
scanf("%lld%lld",&u,&v);
u++,v++;
addedge(u,v);
addedge(v,u);
}
dfs1(1,0);
dfs2(1,1);
// for(int i=1;i<=n;i++)
// {
// cout<<i<<":"<<dfn[i]<<" "<<siz[i]<<endl;
// }
segtree.build(1,1,n);
int Q;
scanf("%lld",&Q);
while(Q--)
{
char opt[2];
scanf("%s",&opt);
if(opt[0]=='A')
{
int u,v,d;
scanf("%lld%lld%lld",&u,&v,&d);
u++,v++;
modifyEdge(u,v,d);
}else{
int u;
scanf("%lld",&u);
u++;
printf("%lld\n",querysubtree(u));
}
}
return 0;
}