class Node:
Node *left
Node *right
key
pri
class Treap:
Node *root
# 再帰的に挿入位置を探索
insert(Node *t, key, pri):
# 葉に達したらノードを生成して返す
if t = NULL:
return Node(key, pri) # ポインタを返す
# 重複するキーを無視する
if key = t.key:
return t
if key < t.key: # 左の子に移動
# 返ってきたノードを左の子にする
t.left ← insert(t.left, key, pri)
# その子の優先度が高ければ、右回転で持ち上げる
if t.pri < t.left.pri:
t ← rightRotate(t)
else: # 右の子に移動
# 返ってきたノードを右の子にする
t.right ← insert(t.right, key, pri)
# その子の優先度が高ければ、左回転で持ち上げる
if t.pri < t.right.pri:
t ← leftRotate(t)
return t
# 対象を再帰的に探索
erase(Node *t, key):
if t = NULL:
return NULL
if key = t.key # t が削除対象
if t.left = NULL and t.right = NULL: # tが葉:
return NULL
else if t.left = NULL: # tがただ1つの右の子を持つ
t ← leftRotate(t)
else if t.right = NULL: # tがただ1つの左の子を持つ
t ← rightRotate(t)
else: # tが2つの子をもつ
# 優先度が高い子を持ち上げる
if t.left.pri > t.right.pri
t ← rightRotate(t)
else:
t ← leftRotate(t)
return erase(t, key)
# 対象を再帰的に探索
if key < t.key:
t.left ← erase(t.left, key)
else:
t.right ← erase(t.right, key)
return t