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