就是上题中我说过得类似的操作。。。
本题只有加和询问操作。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define ss printf("orz\n");
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define INF 0x3f3f3f3f
#define maxn 425000
int id,w[maxn],siz[maxn],en,dep[maxn],n,m,son[maxn];
int first[maxn],next[maxn],to[maxn],top[maxn],fa[maxn],X[maxn],Y[maxn],Z[maxn];
long long sum[maxn],cal[maxn];
void add(int a,int b)
{
en++;
to[en]=b;
next[en]=first[a];
first[a]=en;
}
void dfs(int now)
{
int v,maxv=0;siz[now]=1;
for(int i=first[now];i;i=next[i])
{
v=to[i];
if(fa[now]==v) continue;
fa[v]=now;dep[v]=dep[now]+1;
dfs(v);
siz[now]+=siz[v];
if(maxv<siz[v])
{
maxv=siz[v];
son[now]=v;
}
}
}
void getid(int now,int root)
{
int v;id++;w[now]=id;top[now]=root;
if(son[now]) getid(son[now],root);
for(int i=first[now];i;i=next[i])
{
v=to[i];
if(v==son[now]||v==fa[now]) continue;
getid(v,v);
}
}
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int l,int r)
{
if(cal[rt])
{
int mid=(l+r)>>1;
cal[rt<<1]+=cal[rt];
cal[rt<<1|1]+=cal[rt];
sum[rt<<1]+=(mid-l+1)*cal[rt];
sum[rt<<1|1]+=(r-mid)*cal[rt];
cal[rt]=0;
}
}
void modify(int l,int r,int rt,int x,int y,int v)
{
if(x<=l&&r<=y)
{
sum[rt]+=(r-l+1)*v;
cal[rt]+=v;
return;
}
int mid=(l+r)>>1;
pushdown(rt,l,r);
if(x<=mid) modify(lson,x,y,v);
if(y>mid) modify(rson,x,y,v);
pushup(rt);
}
void getans(int x,int y,int z)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
modify(1,n,1,w[top[x]],w[x],z);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
modify(1,n,1,w[x],w[y],z);
}
long long query(int l,int r,int rt,int x,int y)
{
if(x<=l&&r<=y)
{
return sum[rt];
}
int mid=(l+r)>>1;
pushdown(rt,l,r);
long long ans=0;
if(x<=mid) ans+=query(lson,x,y);
if(y>mid) ans+=query(rson,x,y);
return ans;
}
int main()
{
int a,b,x,y,z,op;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
a++;b++;
add(a,b);
add(b,a);
}
dfs(1);
getid(1,1);
scanf("%d",&m);
char st[10];
while(m--)
{
scanf("%s",st);
if(st[0]=='A')
{
scanf("%d%d%d",&x,&y,&z);
++x;++y;
getans(x,y,z);
}
else
{
scanf("%d",&x);++x;
printf("%lld\n",query(1,n,1,w[x],w[x]+siz[x]-1));
}
}
return 0;
}