cartesian_tree¶
ソースコード¶
from titan_pylib.graph.cartesian_tree import cartesian_tree
展開済みコード¶
1# from titan_pylib.graph.cartesian_tree import cartesian_tree
2def cartesian_tree(a: list[int]) -> tuple[list[int], list[int], list[int]]:
3 """Get cartesian_tree. / O(N)"""
4 n = len(a)
5 par = [-1] * n
6 left = [-1] * n
7 right = [-1] * n
8 path = []
9 for i, e in enumerate(a):
10 pre = -1
11 while path and e < a[path[-1]]:
12 pre = path.pop()
13 if pre != -1:
14 par[pre] = i
15 if path:
16 par[i] = path[-1]
17 path.append(i)
18 for i, p in enumerate(par):
19 if p == -1:
20 continue
21 if i < p:
22 left[p] = i
23 else:
24 right[p] = i
25 return par, left, right