Build in O(N)

Node build(int[] arr) {
  Deque stack = new ArrayDeque<>();
  Node root = null;
  for (int x : arr) {
    Node n = new Node(x);
    Node last = null;
    while (!stack.isEmpty() && stack.peek().val > x) last = stack.pop();
    n.left = last;
    if (!stack.isEmpty()) stack.peek().right = n;
    else root = n;
    stack.push(n);
  }
  return root;
}
Advertisement

Range min via LCA

Min in range [i, j] = LCA of nodes at positions i and j in Cartesian tree.

Advertisement

O(1) RMQ

Cartesian tree + Euler tour + range minimum query on tour. Preprocessing O(N), queries O(1).

Random equivalence

Cartesian tree of random permutation ≡ random BST. Height O(log N) expected.