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