#include <stdio.h>
#include <stdlib.h>

typedef struct node{
	int key;
	int priority;
	struct node *left;
	struct node *right;
}Node;

Node * makeNode(int,int);
Node * rightRotate(Node *);
Node * leftRotate(Node *);
Node * insert(Node **, int, int);
Node * delete(Node **,int);
Node * KeyDelete(Node **,int);
int find(Node *, int);
void inorder(Node *);
void preorder(Node *);
void print(Node *);

int main(){
    int m, k, p;
    char com[8];
    int i;
    Node *root=NULL;

    scanf("%d",&m);

    for(i=0;i<m;i++){
        scanf("%s", com);

        switch(com[0]){
            case 'i':
                scanf("%d %d", &k,&p);
                root=insert(&root,k,p);
                break;
            case 'd':
                scanf("%d", &k);
                root=delete(&root,k);
                break;
            case 'f':
                scanf("%d", &k);
                if(find(root,k)==1) printf("yes\n");
                else printf("no\n");
                break;
            case 'p':
                print(root);
                break;
        }
    }
}

Node * makeNode(int k, int p){
    Node *new=malloc(sizeof(Node));
    new->key=k;
    new->priority=p;
    new->left=NULL;
    new->right=NULL;
    return new;
}

Node * rightRotate(Node *t){
    Node *s = t->left;
    t->left = s->right;
    s->right = t;
    return s; // root of the subtree
}

Node * leftRotate(Node *t){
    Node *s = t->right;
    t->right = s->left;
    s->left = t;
    return s; // root of the subtree
}

Node * insert(Node **t, int key, int priority){          // 再帰的に探索
    Node *new;

    if((*t) == NULL) return new= makeNode(key, priority);    // 葉に到達したら新しい節点を生成して返す
    if(key == (*t)->key) return *t;                   // 重複したkeyは無視

    if(key < (*t)->key){                            // 左の子へ移動
        (*t)->left = insert(&((*t)->left), key, priority);  // 左の子へのポインタを更新
        if ((*t)->priority < (*t)->left->priority)  (*t) = rightRotate((*t));      // 左の子の方が優先度が高い場合右回転
    }
    else {                                                         // 右の子へ移動
        (*t)->right = insert(&((*t)->right), key, priority);          // 右の子へのポインタを更新
        if((*t)->priority < (*t)->right->priority) (*t) = leftRotate((*t));        // 右の子の方が優先度が高い場合左回転
    }
    return *t;
}

Node * delete(Node **t, int key){
    if((*t) == NULL) return NULL;
    if(key < (*t)->key)  (*t)->left = delete(&((*t)->left), key);         // 削除対象を検索
    else if(key > (*t)->key) (*t)->right = delete(&((*t)->right), key);
    else return KeyDelete(t, key);
    return *t;
}

Node * KeyDelete(Node **t, int key){ // 削除対象の節点の場合
    if((*t)->left == NULL && (*t)->right == NULL)  return NULL;      // 葉の場合
    else if((*t)->left == NULL)   (*t) = leftRotate(*t);      // 右の子のみを持つ場合左回転
    else if((*t)->right == NULL) (*t) = rightRotate(*t);      // 左の子のみを持つ場合右回転
    else{                                         // 左の子と右の子を両方持つ場合
        if((*t)->left->priority > (*t)->right->priority){    // 優先度が高い方を持ち上げる
            (*t) = rightRotate(*t);
        }
        else  (*t) = leftRotate(*t);
    }
    return delete(t, key);
}

int find(Node *t, int key){
    while(t!=NULL){
        if(t->key == key) return 1; // yes
        else if(t->key > key) t=t->left;
        else t=t->right;
    }
    return 0; // no
}

void inorder(Node *t){
    if(t->left!=NULL) inorder(t->left);
    printf(" %d", t->key);
    if(t->right!=NULL) inorder(t->right);
}

void preorder(Node *t){
    printf(" %d", t->key);
    if(t->left!=NULL) preorder(t->left);
    if(t->right!=NULL) preorder(t->right);
}

void print(Node *t){
    inorder(t);
    printf("\n");

    preorder(t);
    printf("\n");
}


Measured memory_bytes: 7980