Structure

class TreapNode {
  int key, priority;
  TreapNode left, right;
  TreapNode(int k) { key = k; priority = random(); }
}
Advertisement

Insert with rotations

TreapNode insert(TreapNode t, int key) {
  if (t == null) return new TreapNode(key);
  if (key < t.key) {
    t.left = insert(t.left, key);
    if (t.left.priority > t.priority) t = rotateRight(t);
  } else {
    t.right = insert(t.right, key);
    if (t.right.priority > t.priority) t = rotateLeft(t);
  }
  return t;
}
Advertisement

Merge + split primitives

Treaps support merge(t1, t2) if all keys in t1 < keys in t2. Split(t, key) returns (t_less, t_geq). Powers persistent + implicit treaps.

Implicit treap

Use array index as key (position). Enables O(log N) array-with-inserts, reverse-range, cyclic shift.