0 #P3000. 笛卡尔树(Cartesian Tree)

笛卡尔树(Cartesian Tree)

笛卡尔树(Cartesian Tree)

问题描述

给定一个由 N N 互异整数组成的序列 A=(a0,a1,,aN1) A = (a_0, a_1, \dots, a_{N-1})
构造该序列的笛卡尔树(Cartesian Tree):

  • 树中每个节点对应序列中的一个元素;
  • 树的根是序列中最小值对应的元素;
  • 对于任意节点 i i ,其左子树对应 i i 左侧、且在“下一个更小值”范围内的子序列,右子树对应右侧同理;
  • 形式上:若 i i 是区间 [l,r] [l, r] 中最小值的位置,则其左孩子是 [l,i1] [l, i-1] 中最小值对应节点,右孩子是 [i+1,r] [i+1, r] 中最小值对应节点。

输出该树的父节点数组:p0,p1,,pN1 p_0, p_1, \dots, p_{N-1} ,其中 pi p_i 表示顶点 i i 的父节点编号;根节点 r r 满足 pr=r p_r = r

约束条件

  • 1N106 1 \leq N \leq 10^6
  • 0ai109 0 \leq a_i \leq 10^9
  • 所有 ai a_i 互不相同
  • 所有值均为整数

输入

NN
a0 a1  aN1a_0\ a_1\ \cdots\ a_{N-1}

输出

p0 p1  pN1p_0\ p_1\ \cdots\ p_{N-1}

其中 pi p_i 是顶点 i i 的父节点编号;根节点 r r 满足 pr=r p_r = r

3
1 0 2
1 1 1
11
9 3 7 1 8 12 10 20 15 18 5
1 3 1 3 10 6 4 8 6 8 3