#L4798. 「RMI 2021」Weirdtree

    ID: 5502 传统题 5000ms 256MiB 尝试: 4 已通过: 0 难度: 10 上传者: 标签>数据结构线段树区间最值操作懒标记传播批量更新优化

「RMI 2021」Weirdtree

注意事项
在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

C++(标准为 C++ 1717 及以上) 请在提交源代码前添加 #include "weirdtree.h"


题目描述
题目译自 Romanian Master of Informatics 20212021 Day22 T33 「Weirdtree」

高地女巫阿兹莎发现了一个充满古怪树木的花园!因此,她和她的朋友莱卡决定在那里度过一些时间照顾花园。

花园可以看作是一系列 NN 棵树,其中树木的编号为 11NN 。每棵树都有一个特定的非负整数高度。然后,阿兹莎将根据一个包含 QQ 个条目的日程表来度过她的时间,这些条目可以是几种类型:

  1. 树木切割阶段,由三个整数 ll, rr, kk 表示。在这个阶段,阿兹莎将在接下来的 kk 天内切割树木。每天她都会找到编号在 llrr 之间最高的树,并将其高度减少 11。如果有多棵树具有这种最大高度,她会选择最左边的树。如果最高的树的高度为 00,则当天不会发生任何事情。
  2. 魔法阶段,由两个整数 iixx 表示。在这个阶段,阿兹莎会改变编号为 ii 的树的高度为 xx
  3. 树木询问阶段,由两个整数 llrr 表示。在这个阶段,阿兹莎将找到编号在 llrr 之间(包含 llrr)的树的高度之和。

阿兹莎好奇树木询问阶段的结果是什么,并希望在不经历整个日程表的情况下知道它们。你能帮她吗?


实现细节
你必须实现以下四个函数:

void initialise(int N, int Q, int h[]);
void cut(int l, int r, int k);
void magic(int i, int x);
long long int inspect(int l, int r);

initialise 函数给定 NN(树的数量)、QQ(日程表中的条目数)和一个数组 hh,其中 h[i]h[i] 是树 ii (1iN)(1\leq i\leq N) 的高度。这个函数在会调用其他三个函数之前调用一次。cutmagicinspect 函数分别代表树切割、魔法和树询问阶段,并由它们各自的参数表示。你的 inspect 函数实现必须返回编号在 llrr 之间的树的高度之和。

你不应实现 main 函数。您将在「文件」中获得一个交互器示例 grader.cpp。我们的 main 函数将读取 NN, QQNN 个初始高度的序列和 QQ 个日程表条目。三种类型的日程表条目(cut(l, r, k)magic(i, x)inspect(l, r))的格式分别为 1 l r k2 i x3 l r。这也是样例中使用的输入格式。


样例

输入

6 10
1 2 3 1 2 3
1 1 6 3
3 1 6
1 1 3 3
3 1 6
1 1 3 1000
3 1 6
2 1 1000
3 1 6
1 1 3 999
3 1 5

输出

9
6
5
1005
4

在第一阶段,经过 33 天的树木切割后,树木的高度为 1,2,2,1,2,31,2,2,1,2,31,2,2,1,2,21,2,2,1,2,2;和 1,1,2,1,2,21,1,2,1,2,2。这些值的总和是 99,这是第二阶段询问的答案。

在第三阶段,经过 33 天的树木切割后,树木的高度为 1,1,1,1,2,21,1,1,1,2,20,1,1,1,2,20,1,1,1,2,2;和 0,0,1,1,2,20,0,1,1,2,2。这些值的总和是 66,这是第四阶段询问的答案。

在第五阶段,经过 10001000 天的树木切割后,树木的高度为 0,0,0,1,2,20,0,0,1,2,2。这是因为高度为 00 的树无法被切割。这些值的总和是 55,这是第六阶段询问的答案。

在第七阶段,第一棵树的高度变为 10001000,树木的高度为 1000,0,0,1,2,21000,0,0,1,2,2。这些值的总和是 10051005,这是第八阶段询问的答案。

在第九阶段,每一天的树木切割都会将第一棵树的高度减少 11。这在我们阶段结束时给了我们树高 1,0,0,1,2,21,0,0,1,2,2。前五个值的总和是 44,这是第十个也是最后一个阶段询问的答案。


数据范围与提示
对于所有输入数据,满足:

  • 1N,Q31051 \leq N, Q \leq 3\cdot 10^5
  • 保证 cutmagicinspect 函数总共将被调用 QQ 次。
  • 1iN1 \leq i \leq N
  • 0x,k,h[i]1090 \leq x, k, h[i] \leq 10^9
  • 1lrN1 \leq l \leq r \leq N

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 55 N1000N \leq 1000, Q1000Q \leq 1000, k=1k=1
22 88 N8104N \leq 8\cdot 10^4, Q8104Q \leq 8\cdot 10^4, k=1k=1
33 N1000N \leq 1000, Q1000Q \leq 1000,没有魔法操作
44 1919 没有魔法操作
55 1010 l=1l=1, r=Nr=N
66 2121 N8104N \leq 8\cdot 10^4, Q8104Q \leq 8\cdot 10^4
77 2929 无附加限制