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