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

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

Node NIL,root;

Node rightRotate(Node);
Node leftRotate(Node);
Node insert(Node,int,int);
Node delete(Node,int);
Node _delete(Node,int);
void inOrder(Node);
void preOrder(Node);
Node find(int);

int main(){
	root=NIL;
	int i,n,k,p;	scanf("%d",&n);
	char com[10];

	for(i=0;i<n;i++){
		scanf("%s",com);
		if(com[0]=='i'){
			scanf("%d%d",&k,&p);
			insert(root,k,p);

		}else if(com[0]=='p'){
			inOrder(root);
			printf("\n");
			preOrder(root);
			printf("\n");
		}else if(com[0]=='f'){
			scanf("%d",&k);
			if(find(k)!=NIL)printf("yes\n");
			else printf("no\n");
		}else{
			scanf("%d",&k);
			delete(root,k);
		}
		//printf("\n");
	}

	return 0;
}

Node rightRotate(Node t){
	//printf(" rR\n");
	Node s = t->left;
	if(t==root)root=s;
	t->left = s->right;
	s->right = t;

	return s; // root of the subtree
}
Node leftRotate(Node t){
	//printf(" lR\n");
	Node s = t->right;
	if(t==root)root=s;
	t->right = s->left;
	s->left = t;
	return s; // root of the subtree
}
Node insert(Node t, int k, int p){
	//printf("i ");
	Node x;
	if (t == NIL){
		x=(Node)malloc(sizeof(struct node));
		x->key=k;	x->priority=p;
		x->left=x->right=NIL;

		if(root==NIL)root=x;

		return x;
	}
	if (k == t->key)
		return t;                            // 重複したkeyは無視

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

	return t;
}

Node delete(Node t, int key){
	if (t == NIL)return NIL;

	if (key < t->key)                                // 削除対象を検索
		t->left = delete(t->left, key);
	else if (key > t->key)
		t->right = delete(t->right, key);
	else
		return _delete(t, key);
	return t;
}

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

}void inOrder(Node x){
	if(x==NIL)return;
	inOrder(x->left);
	printf(" %d",x->key);
	inOrder(x->right);
}
void preOrder(Node x){
	if(x==NIL)return;
	printf(" %d",x->key);
	preOrder(x->left);
	preOrder(x->right);
}
Node find(int k){
	Node p=root;

	while(p!=NIL){
		if(p->key==k){
			return p;
		}

		if(k < p->key)p=p->left;
		else p=p->right;
	}

	return NIL;
}


