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 只有一个右子节点
                t ← leftRotate(t)
            else if t.right = NULL:              # t 只有一个左子节点
                t ← rightRotate(t)
            else:                                # t 有两个子节点
                # 提升优先级高的子节点
                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