样例过了,全 WA 求条
#include<bits/stdc++.h>
#define LL k<<1
#define RR k<<1|1
#define int long long
using namespace std;
const int N = 1e6 + 1;
int d[N], siz[N], l[N], a[N], fa[N], son[N], tot, top[N],n,ToT;
vector<int>vec[N];
struct rush_E {
int l, r, sum, lazy;
} t[4 * N + 1];
void dfs1(int u) {
siz[u] = 1;
for (auto v : vec[u]) {
if (v != fa[u]) {
fa[v] = u;
d[v] = d[u] + 1;
dfs1(v);
siz[u] += siz[v];
if (siz[v] > siz[son[u]]) {
son[u] = v;
}
}
}
}
void dfs2(int u, int t) {
l[u] = ++tot;
top[u] = t;
if (son[u])dfs2(son[u], t);
for (auto v : vec[u]) {
if (v != fa[u] && v != son[u]) {
dfs2(v, v);
}
}
}
void pushup(int k) {
t[k].sum = (t[LL].sum + t[RR].sum);
}
void pushdown(int k) {
if (t[k].lazy) {
int l = t[k].l, r = t[k].r;
int mid = l + r >> 1;
t[LL].lazy += t[k].lazy;
t[RR].lazy += t[k].lazy;
t[LL].sum += ((mid - l + 1) * t[k].lazy);
t[RR].sum += ((r - mid) * t[k].lazy);
t[k].lazy = 0;
}
}
void build(int k, int l, int r) {
t[k].l = l;
t[k].r = r;
if (l == r) {
return;
}
int mid = l + r >> 1;
build(LL, l, mid);
build(RR, mid + 1, r);
}
int qsum(int k, int l, int r) {
if (t[k].l >= l && t[k].r <= r) {
return t[k].sum;
}
int ans=0,mid=t[k].l+t[k].r>>1;
pushdown(k);
if(l<=mid){
ans+=qsum(LL,l,mid);
}
if(r>mid){
ans+=qsum(RR,mid+1,r);
}
return ans;
}
void update(int k,int l,int r,int v){
if(t[k].l>=l&&t[k].r<=r){
t[k].lazy+=v;
t[k].sum+=((t[k].r-t[k].l+1)*v);
return;
}
int mid=t[k].l+t[k].r>>1;
pushdown(k);
if(l<=mid){
update(LL,l,r,v);
}
if(r>mid){
update(RR,l,r,v);
}
pushup(k);
}
void tup(int u,int v,int w){
while(top[u] != top[v]){
if(d[top[u]] < d[top[v]])swap(u,v);
update(1,l[top[u]],l[u],w);
u=fa[top[u]];
}
if(d[u] > d[v])swap(u,v);
update(1,l[u],l[v],w);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
++u;
++v;
vec[u].push_back(v);
vec[v].push_back(u);
}
dfs1(1);
dfs2(1,1);
build(1,1,n);
cin>>ToT;
while(ToT--){
char c;
int x,y,z;
cin>>c>>x;
++x;
if(c=='Q'){
cout<<qsum(1,l[x],l[x]+siz[x]-1)<<'\n';
}
if(c=='A'){
cin>>y>>z;
++y;
tup(x,y,z);
}
}
return 0;
}