解:splay维护括号序列,就是进子树一次出子树一次。树上每个点直接记录这两个点的编号。

建树的时候按照分配的编号建树。

 #include <bits/stdc++.h>
typedef long long LL;
#define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),pa==pb)?EOF:*pa++
static char buf[],*pa(buf),*pb(buf);
template <class T> inline void read(T &x) {
x = ;
register char c(gc);
while((c<''||c>'')&&c!='-')
c=gc;
register int f(c=='-'?c=gc,-:);
while(c>=''&&c<='')
x=x*+c-,c=gc;
x*=f;
return;
} const int N = ;
const LL INF = 0x3f3f3f3f3f3f3f3fll; struct Edge {
int nex, v;
}edge[N]; int tp; int fa[N], op[N], ed[N], s[N][], root, stk[N], top;
LL large[N], val[N], Val[N], tag[N];
int e[N], num = , n, id[N]; inline void add(int x, int y) {
tp++;
edge[tp].v = y;
edge[tp].nex = e[x];
e[x] = tp;
return;
} void DFS(int x, int f) {
id[++num] = x;
op[x] = num;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(y == f) continue;
DFS(y, x);
}
id[++num] = x;
ed[x] = num;
return;
} inline void pushup(int x) {
large[x] = std::max(large[s[x][]], large[s[x][]]);
large[x] = std::max(large[x], val[x]);
if(!fa[x]) root = x;
return;
} inline void pushdown(int x) {
if(tag[x]) {
if(s[x][]) {
tag[s[x][]] += tag[x];
val[s[x][]] += tag[x];
large[s[x][]] += tag[x];
}
if(s[x][]) {
tag[s[x][]] += tag[x];
val[s[x][]] += tag[x];
large[s[x][]] += tag[x];
}
tag[x] = ;
}
return;
} void out(int x = root) {
pushdown(x);
if(s[x][]) {
out(s[x][]);
}
printf("%d ", id[x]);
if(s[x][]) {
out(s[x][]);
}
return;
} inline void rotate(int x) {
int y = fa[x];
int z = fa[y];
bool f = (s[y][] == x); fa[x] = z;
if(z) {
s[z][s[z][] == y] = x;
}
s[y][f] = s[x][!f];
if(s[x][!f]) {
fa[s[x][!f]] = y;
}
s[x][!f] = y;
fa[y] = x; pushup(y);
return;
} inline void splay(int x, int g = ) {
int y = x;
stk[top = ] = y;
while(fa[y]) {
y = fa[y];
stk[++top] = y;
}
while(top) {
pushdown(stk[top]);
top--;
} y = fa[x];
int z = fa[y];
while(y != g) {
if(z != g) {
(s[z][] == y) ^ (s[y][] == x) ?
rotate(x) : rotate(y);
}
rotate(x);
y = fa[x];
z = fa[y];
}
pushup(x);
return;
} inline int getLP() {
pushdown(root);
int p = s[root][];
while(s[p][]) {
p = s[p][];
pushdown(p);
}
return p;
} inline int getRP() {
pushdown(root);
int p = s[root][];
while(s[p][]) {
p = s[p][];
pushdown(p);
}
return p;
} int build(int l, int r, int f) {
int mid = (l + r) >> ;
//int x = np(f, Val[id[mid]]);
fa[mid] = f;
val[mid] = large[mid] = Val[id[mid]];
if(l < mid) s[mid][] = build(l, mid - , mid);
if(mid < r) s[mid][] = build(mid + , r, mid);
pushup(mid);
return mid;
} inline void Add(int x, LL v) {
splay(op[x]);
int a = getLP();
splay(ed[x]);
int b = getRP();
splay(b);
splay(a, b);
int z = s[a][];
tag[z] += v;
large[z] += v;
val[z] += v;
pushup(a);
pushup(b);
return;
} int main() { int q, rt, x; LL y;
read(n); read(q); read(rt);
for(register int i = ; i <= n; i++) {
read(Val[i]);
}
for(register int i = ; i < n; i++) {
read(x); read(y);
add(x, y); add(y, x);
} DFS(rt, ); /*for(int i = 1; i <= num + 1; i++) {
printf("%d ", id[i]);
}
puts("");*/ Val[] = val[] = -INF;
root = build(, num + , ); //out(), puts(""); for(int i = , f; i <= q; i++) {
read(f); read(x);
if(f == ) { /// out max subtree x
splay(op[x]);
int a = getLP();
splay(ed[x]);
int b = getRP();
splay(b);
splay(a, b);
printf("%lld\n", large[s[a][]]);
}
else if(f == ) { /// subtree x += y
read(y);
Add(x, y);
}
else if(f == ) { /// change fa[x] -> y
read(y);
splay(op[x]);
int a = getLP();
splay(ed[x]);
int b = getRP(); /*printf("%d op = %d ed = %d \n", x, op[x], ed[x]);
printf("a=%d %d b=%d %d \n", a, id[a], b, id[b]);*/ splay(b);
splay(a, b);
int z = s[a][];
s[a][] = fa[z] = ;
pushup(a);
pushup(b);
splay(op[y]);
int t = getRP();
splay(t, op[y]);
s[t][] = z; fa[z] = t;
pushup(t);
pushup(op[y]);
}
//out(), puts("");
} return ;
}

AC代码

[模板]ETT的更多相关文章

  1. [BZOJ3786]星系探索(伪ETT)

    3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1638  Solved: 506[Submit][Status][Discuss ...

  2. [长期更新]模板&算法学习情况

    这里仅作为自我检查用,模板代码请移步其他博文 标+的表示已学完,标?的表示需要进一步学习,标-的表示有计划但未开始学习,标*的表示暂时没有计划学习 数学 ?BSGS +FFT&NTT ?Luc ...

  3. Java 将Excel转为et和ett格式

    以.et结尾的文件格式是属于金山办公软件WPS Office中的电子表格文件,.ett是一种模板文件格式.除了通过WPS软件可以创建该格式的电子表格外,也可以通过格式转换的方法来获得,如将Micros ...

  4. Jade模板引擎让你飞

    写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...

  5. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  6. CMS模板应用调研问卷

    截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  9. OpenCV模板匹配算法详解

    1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...

随机推荐

  1. Gevent 性能和 gevent.loop 的运用和带来的思考

    知乎自己在底层造了非常多的轮子,而且也在服务器部署方面和数据获取方面广泛使用 gevent 来提高并发获取数据的能力.现在开始我将结合实际使用与测试慢慢完善自己对 gevent 更全面的使用和扫盲. ...

  2. python学习笔记(5)-time库的使用

    import time 一.时间获取函数 time(), ctime(),gmtime() >>> import time >>> time.time() 1524 ...

  3. Spring Boot 构建电商基础秒杀项目 (七) 自动校验

    SpringBoot构建电商基础秒杀项目 学习笔记 修改 UserModel 添加注解 public class UserModel { private Integer id; @NotBlank(m ...

  4. poj-2752(拓展kmp)

    题意:求一个串所有的前后缀字串: 解题思路:kmp和拓展kmp都行,个人感觉拓展kmp更裸一点: 拓展kmp: #include<iostream> #include<algorit ...

  5. 进程间通信IPC与Binder机制原理

    1, Intent隐式意图携带数据 2, AIDL(Binder) 3, 广播BroadCast 4, 内容提供者ContentProvider 5,Messager(内部通过binder实现) 6, ...

  6. linux常用命令(个人总结)

    1.快捷键: ctrl + l           --------------------清屏 ctrl + c          --------------------退出当前命令 ctrl + ...

  7. BZOJ3790神奇项链——manacher+贪心

    题目描述 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字 母组成的字符串,每个小写字母表示一种颜色.为了制作这个项链,小 H 购买了两个机器.第一个机器可以生成所有形式 ...

  8. TP5.x——update更新成功但是返回是0

    原因 更新的数据和表中的数据一致,这个官方文档上有说明的.所以大家使用这个语句的话需要注意 update 方法返回影响数据的条数,没修改任何数据返回 0 解决方法:我是进行了判断如何和数据库一致直接返 ...

  9. UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】

    题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...

  10. Django+Xadmin打造在线教育系统(一)

    系统概括: 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心. 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏.可以删除收藏,我的消息. 导航栏: 公开课,授课讲师 ...