#CF1290E. Cartesian Tree
Cartesian Tree
markdown
E. 笛卡尔树
时间限制:每个测试点 秒
内存限制:每个测试点 MB
输入:标准输入
输出:标准输出
Ildar 是 William 和 Harris 的算法老师。今天,Ildar 正在讲解笛卡尔树。不过 Harris 生病了,所以只有 William 在上课。
笛卡尔树是一棵有根树,可以由一个由互不相同的整数构成的序列构造而成。构造方法如下:
- 如果序列为空,则返回一棵空树;
- 设最大元素的位置为 ;
- 将位置 上的元素从序列中移除(只是临时取出,并非真正删除),并将原序列分成左半部分和右半部分(可能为空);
- 分别对左、右两部分递归构建笛卡尔树;
- 为位置 上的元素创建一个新结点,作为新树的根。如果左、右两部分构造出的树根存在,则它们成为该结点的子结点;
- 返回构造好的树。
例如,对于序列 ,其笛卡尔树如下所示:
(此处应有图片,但文本中省略)
讲完笛卡尔树的定义后,Ildar 布置了作业。他首先有一个空序列 。
在第 轮中,他将一个值为 的元素插入到 的某个位置。然后,他提出一个问题:对于当前序列 所对应的笛卡尔树,所有结点的子树大小之和是多少?
结点 在结点 的子树中,当且仅当 或 在 的某个子结点的子树中。结点 的子树大小是指满足“ 在 的子树中”的结点 的个数。
Ildar 总共会进行 轮。作业就是这 个问题的答案序列。
第二天,Ildar 告诉 Harris 他也必须完成这份作业。Harris 从 William 那里得到了序列 的最终状态,但他不知道如何求出这 个问题的答案。请帮助 Harris!
输入
第一行包含一个整数 ()。
第二行包含 个整数 ()。保证 到 的每个整数在序列中恰好出现一次。
输出
输出 行,第 行包含一个整数 —— 第 个问题的答案。
样例
输入样例 1
5
2 4 1 5 3
输出样例 1
1
3
6
8
11
输入样例 2
6
1 2 4 5 6 3
输出样例 2
1
3
6
8
12
17
注释
- 第一轮后,序列为 。对应的树只有一个结点,答案为 。
- 第二轮后,序列为 。对应的树中,结点 的子树大小为 ,结点 的子树大小为 ,答案为 。
- 第三轮后,序列为 。对应的树中,结点 的子树大小为 ,结点 的子树大小为 ,结点 的子树大小为 ,答案为 。
- 第四轮后,序列为 。对应的树中,结点 的子树大小为 ,结点 的子树大小为 ,结点 的子树大小为 ,结点 的子树大小为 ,答案为 。
- 第五轮后,序列为 。对应的树中,结点 的子树大小为 ,结点 的子树大小为 ,结点 的子树大小为 ,结点 的子树大小为 ,结点 的子树大小为 ,答案为 。