#CF1290E. Cartesian Tree

Cartesian Tree

markdown

E. 笛卡尔树

时间限制:每个测试点 55
内存限制:每个测试点 256256 MB
输入:标准输入
输出:标准输出

Ildar 是 William 和 Harris 的算法老师。今天,Ildar 正在讲解笛卡尔树。不过 Harris 生病了,所以只有 William 在上课。

笛卡尔树是一棵有根树,可以由一个由互不相同的整数构成的序列构造而成。构造方法如下:

  • 如果序列为空,则返回一棵空树;
  • 设最大元素的位置为 pp
  • 将位置 pp 上的元素从序列中移除(只是临时取出,并非真正删除),并将原序列分成左半部分和右半部分(可能为空);
  • 分别对左、右两部分递归构建笛卡尔树;
  • 为位置 pp 上的元素创建一个新结点,作为新树的根。如果左、右两部分构造出的树根存在,则它们成为该结点的子结点;
  • 返回构造好的树。

例如,对于序列 [1,2,7,3,5,6,4][1,2,7,3,5,6,4],其笛卡尔树如下所示:

(此处应有图片,但文本中省略)

讲完笛卡尔树的定义后,Ildar 布置了作业。他首先有一个空序列 SS

在第 ii 轮中,他将一个值为 aia_i 的元素插入到 SS 的某个位置。然后,他提出一个问题:对于当前序列 SS 所对应的笛卡尔树,所有结点的子树大小之和是多少?

结点 uu 在结点 vv 的子树中,当且仅当 u=vu = vuuvv 的某个子结点的子树中。结点 vv 的子树大小是指满足“uuvv 的子树中”的结点 uu 的个数。

Ildar 总共会进行 nn 轮。作业就是这 nn 个问题的答案序列。

第二天,Ildar 告诉 Harris 他也必须完成这份作业。Harris 从 William 那里得到了序列 SS 的最终状态,但他不知道如何求出这 nn 个问题的答案。请帮助 Harris!

输入

第一行包含一个整数 nn1n1500001 \le n \le 150000)。

第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n1ain1 \le a_i \le n)。保证 11nn 的每个整数在序列中恰好出现一次。

输出

输出 nn 行,第 ii 行包含一个整数 —— 第 ii 个问题的答案。

样例

输入样例 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

注释

  • 第一轮后,序列为 [2][2]。对应的树只有一个结点,答案为 11
  • 第二轮后,序列为 [2,1][2,1]。对应的树中,结点 22 的子树大小为 22,结点 11 的子树大小为 11,答案为 2+1=32+1=3
  • 第三轮后,序列为 [2,1,3][2,1,3]。对应的树中,结点 22 的子树大小为 33,结点 11 的子树大小为 11,结点 33 的子树大小为 22,答案为 3+1+2=63+1+2=6
  • 第四轮后,序列为 [2,4,1,3][2,4,1,3]。对应的树中,结点 22 的子树大小为 44,结点 44 的子树大小为 11,结点 11 的子树大小为 22,结点 33 的子树大小为 11,答案为 4+1+2+1=84+1+2+1=8
  • 第五轮后,序列为 [2,4,1,5,3][2,4,1,5,3]。对应的树中,结点 22 的子树大小为 55,结点 44 的子树大小为 33,结点 11 的子树大小为 11,结点 55 的子树大小为 11,结点 33 的子树大小为 11,答案为 5+3+1+1+1=115+3+1+1+1=11