题目链接

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e4+,inf=0x3f3f3f3f;
int hd[N],ne,n,k,fa[N],son[N],siz[N],dep[N],top[N],dfn[N],rnk[N],tot,a[N],sum[N<<],mx[N<<];
struct E {int v,nxt;} e[N<<];
void addedge(int u,int v) {e[ne]= {v,hd[u]},hd[u]=ne++;}
void dfs1(int u,int f,int d) {
fa[u]=f,son[u]=,siz[u]=,dep[u]=d;
for(int i=hd[u]; ~i; i=e[i].nxt) {
int v=e[i].v;
if(v==fa[u])continue;
dfs1(v,u,d+),siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
}
void dfs2(int u,int tp) {
top[u]=tp,dfn[u]=++tot,rnk[dfn[u]]=u;
if(!son[u])return;
dfs2(son[u],top[u]);
for(int i=hd[u]; ~i; i=e[i].nxt) {
int v=e[i].v;
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
}
#define ls u<<1
#define rs u<<1|1
void pu(int u) {sum[u]=sum[ls]+sum[rs],mx[u]=max(mx[ls],mx[rs]);}
void build(int u=,int l=,int r=tot) {
if(l==r) {sum[u]=mx[u]=a[l]; return;}
int mid=(l+r)>>;
build(ls,l,mid),build(rs,mid+,r);
pu(u);
}
void upd(int p,int x,int u=,int l=,int r=tot) {
if(l==r) {sum[u]=mx[u]=x; return;}
int mid=(l+r)>>;
p<=mid?upd(p,x,ls,l,mid):upd(p,x,rs,mid+,r);
pu(u);
}
void qry(int L,int R,int& _sum,int& _mx,int u=,int l=,int r=tot) {
if(l>=L&&r<=R) {_sum+=sum[u],_mx=max(_mx,mx[u]); return;}
if(l>R||r<L)return;
int mid=(l+r)>>;
qry(L,R,_sum,_mx,ls,l,mid),qry(L,R,_sum,_mx,rs,mid+,r);
}
void change(int u,int x) {upd(dfn[u],x);}
void ask(int u,int v,int& _sum,int& _mx) {
_sum=,_mx=~inf;
for(; top[u]!=top[v]; u=fa[top[u]]) {
if(dep[top[u]]<dep[top[v]])swap(u,v);
qry(dfn[top[u]],dfn[u],_sum,_mx);
}
if(dep[u]<dep[v])swap(u,v);
qry(dfn[v],dfn[u],_sum,_mx);
}
int main() {
memset(hd,-,sizeof hd),ne=;
scanf("%d",&n);
for(int i=; i<n; ++i) {
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
tot=,dfs1(,,),dfs2(,);
for(int i=; i<=n; ++i)scanf("%d",&a[dfn[i]]);
build();
char s[];
scanf("%d",&k);
while(k--) {
int a,b;
scanf("%s%d%d",s,&a,&b);
if(s[]=='H')change(a,b);
else {
int _sum,_mx;
ask(a,b,_sum,_mx);
if(s[]=='S')printf("%d\n",_sum);
else printf("%d\n",_mx);
}
}
return ;
}

最新文章

  1. [原创]Macbook Pro Retina 15吋安装Windows 7和Windows 8.1方法
  2. 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)
  3. 从零开始学iPhone开发(5)——使用MapKit
  4. What is the difference Apache (Http Server) and Tomcat (Servlet Container)
  5. HDU3333 Turing Tree 离线树状数组
  6. 机器学习-----线性回归浅谈(Linear Regression)
  7. Android 内核初识(4)属性服务器
  8. Cramfs、JFFS2、YAFFS2的全面对比
  9. 【sed】增加一列【shell文本处理】
  10. SPOJ 10570 LONGCS - Longest Common Substring
  11. v-echart 按需加载
  12. codeforces #541 F Asya And Kittens(并查集+输出路径)
  13. CentOS7.3上如何安装Apache/2.4.34
  14. 【重新分配分片】Elasticsearch通过reroute api重新分配分片
  15. MySQL Binlog与数据变更
  16. Hi3518EV200音频相关
  17. 如何将字符串转化为Jsoup的Document 对象
  18. hdu 2838 Cow Sorting (树状数组+逆序对)
  19. visual studio code 个人设置
  20. 与Web交互可用的图片Base64编码

热门文章

  1. Python之匿名函数(Day18)
  2. pyhton3 os模块
  3. Vimium~让您的Chrome起飞
  4. VM and Docker Container
  5. Redis集群环境搭建
  6. 关于C++ 中的this 的理解
  7. juniper常用命令(二)
  8. MySQL/MariaDB数据库备份与恢复之mysqlpump入门操作
  9. c#.NET中日志信息写入Windows日志中解决方案
  10. 从配置maven环境到maven项目的新建