解: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. js对input框的可编辑属性设置

    添加disabled属性 $('#areaSelect').attr("disabled",true); $('#areaSelect').attr("disabled& ...

  2. day 7-9 IO模型

    一,同步和异步,阻塞和非阻塞 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就 ...

  3. Android——MaterialDesign之三NavigationView

    NavigationView的使用 这里我们来讲讲在Android5.0之后推出的NavigationView的具体使用方式.和普通的侧拉菜单制作方式一样,首先所有的东西还是都放在一个DrawerLa ...

  4. 老男孩python学习自修第十四天【序列化和json】

    序列化是使用二进制的方式加密列表,字典或集合,反序列化是解密的过程:序列化开启了两个独立进程进行数据交互的通路 使用pickle进行序列化和反序列化 例如: pickle_test.py #!/usr ...

  5. Delphi 限制Edit输入 多个例子

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in [ '.',#8]) then ...

  6. 错误模块名称: KERNELBASE.dll错误

    今天在部署一个C/S程序的时候出了bug,日志都没有记载:本地调试当然是没问题的,所以不是代码问题,百度之发现KERNELBASE.dll这个文章说的比较靠谱,仔细研究了自己的配置文件后,果然是配置文 ...

  7. HTML中文本过长时自动隐藏末尾部分或中间等任意部分

    一.    一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px;                      ...

  8. 使用styled-components实现CSS in JS

    前面的话 使用jsx语法可以实现HTML in JS,使用svgr可以实现svg in JS,使用styled-components可以实现CSS in JS.这样,使用react开发,就变成了使用J ...

  9. Uncaught SyntaxError: Unexpected token export

    开发过程中遇到这个错误,虽然不影响使用,但是每次浏览器控制台都会有错误输出,看起来十分不舒服,故翻阅资料发现是因为浏览器虽然支持了es6,但是不支持es6的Module直接使用,需要在script标签 ...

  10. CSS知识点总结[部分]

    css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 注释为 /* 注释内容 */ ...