#include<bits/stdc++.h>
using namespace std;
const int MX=;
struct Edge{int to,nxt;}e[*MX];
struct node{int mx;long long sum;}t[*MX];
int n,Index,fir[MX],fa[MX],dfn[MX],dep[MX],siz[MX],son[MX],Top[MX],w[MX],bel[MX],dfs_cnt;
inline void ins(int u,int v){e[++Index]=(Edge){v,fir[u]},fir[u]=Index;}
void dfs1(int x){
siz[x]++,dep[x]=dep[fa[x]]+;
for(int i=fir[x];i;i=e[i].nxt)if(e[i].to!=fa[x]){
fa[e[i].to]=x;
dfs1(e[i].to);
siz[x]+=siz[e[i].to];
if(siz[e[i].to]>siz[son[x]])son[x]=e[i].to;
}
}
void dfs2(int x){
Top[x]=(son[fa[x]]==x)?Top[fa[x]]:x;
dfn[x]=++dfs_cnt,bel[dfs_cnt]=x;
if(!son[x])return;
dfs2(son[x]);
for(int i=fir[x];i;i=e[i].nxt)if(e[i].to!=fa[x]&&e[i].to!=son[x]){
dfs2(e[i].to);
}
}
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
inline void push_up(int o){
t[o].mx=max(t[ls(o)].mx,t[rs(o)].mx);
t[o].sum=t[ls(o)].sum+t[rs(o)].sum;
}
void build(int L,int R,int o){
if(L==R){t[o].sum=t[o].mx=w[bel[L]];return;}
int mid=L+R>>;
build(L,mid,ls(o)),build(mid+,R,rs(o));
push_up(o);
}
void updata(int L,int R,int o,int x,int v){
if(L==R){t[o].mx=t[o].sum=v;return;}
int mid=L+R>>;
if(x<=mid)updata(L,mid,ls(o),x,v);
else updata(mid+,R,rs(o),x,v);
push_up(o);
}
long long query(int L,int R,int o,int l,int r,int f){
if(L==l&&R==r)return (~f)?t[o].sum:t[o].mx;
int mid=L+R>>;
if(r<=mid)return query(L,mid,ls(o),l,r,f);
else if(l>mid) return query(mid+,R,rs(o),l,r,f);
else {
if(~f)return query(L,mid,ls(o),l,mid,f)+query(mid+,R,rs(o),mid+,r,f);
else return max(query(L,mid,ls(o),l,mid,f),query(mid+,R,rs(o),mid+,r,f));
}
}
const int inf=0x7fffffff;
long long Query(int u,int v,int f){
long long ret=(~f)?:-inf;
while(Top[u]!=Top[v]){
if(dep[Top[u]]<dep[Top[v]])swap(u,v);
if(~f)ret+=query(,n,,dfn[Top[u]],dfn[u],f);
else ret=max(ret,query(,n,,dfn[Top[u]],dfn[u],f));
u = fa[Top[u]];
}
if(dep[u]<dep[v])swap(u,v);
if(~f)ret+=query(,n,,dfn[v],dfn[u],f);
else ret=max(ret,query(,n,,dfn[v],dfn[u],f));
return ret;
}
char op[];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
scanf("%d",&n);
for(int i=;i<n;i++){
int u,v;scanf("%d%d",&u,&v);
ins(u,v),ins(v,u);
}
for(int i=;i<=n;i++)scanf("%d",w+i);
dfs1(),dfs2(),build(,n,);
int q,u,v;scanf("%d",&q);
while(q--){
scanf("%s%d%d",op,&u,&v);
if(*op=='C')updata(,n,,dfn[u],v);
else printf("%lld\n",op[]=='S'?Query(u,v,):Query(u,v,-));
}
}

树剖模板by fcdalao的更多相关文章

  1. 【树链剖分】洛谷P3384树剖模板

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  2. 洛谷树剖模板题 P3384 | 树链剖分

    原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include< ...

  3. Aragorn's Story HDU - 3966 -树剖模板

    HDU - 3966 思路 :树链剖分就是可以把一个路径上的点映射成几段连续的区间上.这样对于连续的区间可以用线段树维护, 对于每一段连续的区间都可以通过top [ ]数组很快的找到这段连续区间的头. ...

  4. 树剖模板(洛谷P3384 【模板】树链剖分)(树链剖分,树状数组,树的dfn序)

    洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\su ...

  5. [NOI2015,LuoguP2146]软件包管理器------树剖

    ***题目链接戳我*** 又是在树上瞎搞滴题目.... 我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖 分析完毕,似乎没啥好说的 ...

  6. UVA1674 闪电的能量 树剖

    UVA1674 闪电的能量 树剖 题面 水.树剖模板 #include <cstdio> #include <cstring> #include <algorithm&g ...

  7. 【61测试】【dp】【二分】【前缀和】【树剖】

    不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...

  8. tarjan,树剖,倍增求lca

    1.tarjan求lca 思想: void tarjan(int u,int f){ for(int i=---){//枚举边 if(v==f) continue; dfs(v); //继续搜 uni ...

  9. SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)

    You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...

随机推荐

  1. 【tp5.1】微信公众号授权登录及获取信息录入数据库

    微信公众号开发文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 微信公众号授权登录分为两种: 1.以 ...

  2. 右键添加git-bash

    主要: 右键如果没有git-bash,如何给右键手动添加 前面对右键存在git-bash但使用出现问题的解决,也想到如果右键都没有,该如何给右键添加了,于是接着记录下如何添加的过程: 情形: 手动给右 ...

  3. Python3爬虫(九) 数据存储之关系型数据库MySQL

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 关系型数据库关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库的存储方式就是行列 ...

  4. Python自动化运维——DNS处理模块

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:dnspython 功能: 支持所有的记录类型 可以用于查询.传输并动态更新ZONE信息 支持TSIG(事务 ...

  5. python2.7入门---网络编程(socket)

        Python 提供了两个级别访问的网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别 ...

  6. AR技术介绍(Located in Android)

    一,什么是AR 在说AR技术之前,先来说说VR. 虚拟现实(VR:Virtual Reality)是采用以计算机技术为核心的技术,生成逼真的视,听,触觉等一体化的虚拟环境,用户借助必要的设备以自然的方 ...

  7. 创龙TMS320C6748开发找不到 tl.dsp.evm6748的问题研究

    1. 使用中遇到问题,看了一下帖子说是把tl.dsp.evm6748换成ti.platforms.evm6748可以编译过去.这个包是在XDCtools里面的. js: "D:/ti/ccs ...

  8. Myeclipse报错-Java compiler level does not match 完美解决方法

    从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description  Resource Path Location Type Java compiler level d ...

  9. 【多线程】 Task ,async ,await

    [多线程]Task ,async ,await 一. WinForm 里经常会用到多线程, 多线程的好出就不多说了,来说说多线程比较麻烦的地方 1. UI 线程与其他线程的同步,主要是 Form 和 ...

  10. What to do when Enterprise Manager is not able to connect to the database instance (ORA-28001)

    摘自:http://dbtricks.com/?p=34 If you are trying to connect to the Oracle enterprise Manger and you ge ...