#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. Redis面试问题

    下面列出的这些其中有一些是我面试时遇到的,但是当时自己还不会,所以在网站上找了以下,然后整理出来,加强记忆 感谢码洞将这些问题整理出来: Redis有哪些数据结构? 字符串String.字典Hash. ...

  2. MongoDB学习(1)--安装,基本curd操作

    知识点: 1-MongoDB 安装,启动和卸载 2-基本概念 3-基本的增删改查操作(CURD) 来回顾总结一把学习的mongodb,如果有javascript基础,学习"芒果DB" ...

  3. sqlite3 简单实用方法

    打开数据库:sqlite3.exe test.db 显示所有表: .tables 退出 sqlite3:.quit 还有个问题,已经打开一个数据库文件了. 不知道如何在不退出命令行的情况下,更换另一个 ...

  4. 学习python第一天 pycharm设置

    print(“hello,world”) pycharm设置 1. 选择python 解析器,目的是确定pycharm 的运行环境. 方法: File-->Settings-->Proje ...

  5. Vue 服务器端渲染(一)

    什么是服务器端渲染(SSR)? Vue.js 是构建客户端应用程序的框架.默认情况下,可以在浏览器中输出 Vue 组件,进行生成 DOM 和操作 DOM.然而,也可以将同一个组件渲染为服务器端的 HT ...

  6. Flask初见

    Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSIG工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 .Flask使用 BSD 授权. Flask也被称为 “m ...

  7. Leecode刷题之旅-C语言/python-53.最大子序和

    /* * @lc app=leetcode.cn id=53 lang=c * * [53] 最大子序和 * * https://leetcode-cn.com/problems/maximum-su ...

  8. Python3 使用基本循环实现多级目录(思路)

    一.多级目录设计: 1. 通过循环的方式显示菜单和进入菜单 2. 设置标志位以提供回退上一层菜单 2. 设置标志位以提供退出程序 二.注意要点: 1. 菜单样式,层次关系不要弄混乱 2. 当输入错误时 ...

  9. .Net 面试题 汇总(一)

    1.@page指令只能在_aspx___文件(填写扩展名)中使用,而@Control指令只能用在_ascx___文件(填写扩展名)中使用. 2.说明控件DataGrid,DataTable,DataV ...

  10. 编译net core时nuget里全部报错,\obj\project.assets.json找不到

    除了Nuget管理设置允许下载缺少的程序包 如果你自己设置的程序包源里有一个源访问不到,则可能出现下面错误,导致所有nuget无法还原. 而且在VS2017里不会出现这个 SDK,特别是你网上下载的其 ...