Pagini recente » Cod sursa (job #1265443) | Cod sursa (job #126023) | Cod sursa (job #1153965) | Cod sursa (job #57412) | Cod sursa (job #1525346)
#include<cstdio>
#include<ctime>
#include<stdlib.h>
#define inf 2000000000
using namespace std;
int found;
char op[10],current=0;
struct treap{
int key;
int priority;
int minim;
int maxim;
int dif_minim;
treap *left;
treap *right;
};
treap *root,*nil;
int maximum(int a,int b){
if(a<b)
return b;
return a;
}
int minimum(int a,int b){
if(a>b)
return b;
return a;
}
void update(treap *&node){
node->minim=minimum(node->key,node->left->minim);
node->maxim=maximum(node->key,node->right->maxim);
node->dif_minim=minimum(minimum(node->left->dif_minim,node->right->dif_minim),minimum(node->key-node->left->maxim,node->right->minim-node->key));
}
void rotate_right(treap *&node){
treap *temp=node->right;
node->right=temp->left;
temp->left=node;
node=temp;
if(node!=nil&&node->left!=nil)
update(node->left);
}
void rotate_left(treap *&node){
treap *temp=node->left;
node->left=temp->right;
temp->right=node;
node=temp;
if(node!=nil&&node->right!=nil)
update(node->right);
}
void balance(treap *&node){
if(node->left->priority>node->priority)
rotate_left(node);
else
if(node->right->priority>node->priority)
rotate_right(node);
update(node);
}
void treap_insert(treap *&node,int key,int priority){
if(node==nil){
node=new treap;
current++;
node->key=node->minim=node->maxim=key;
node->priority=priority;
node->dif_minim=inf;
node->left=node->right=nil;
return;
}
if(node->key==key)
return;
if(key>node->key)
treap_insert(node->right,key,priority);
else
treap_insert(node->left,key,priority);
balance(node);
}
void treap_erase(treap *&node,int key){
if(node==nil)
return;
if(key>node->key)
treap_erase(node->right,key);
else
if(key<node->key)
treap_erase(node->left,key);
else{
found=1;
if(node->left==nil&&node->right==nil){
delete(node);
node=nil;
return;
}
if(node->left->priority<node->right->priority)
rotate_right(node);
else
rotate_left(node);
treap_erase(node,key);
}
if(node!=nil)
update(node);
}
int treap_find(treap *&node,int key){
if(node==nil)
return 0;
if(node->key==key)
return 1;
if(node->key<key)
return treap_find(node->right,key);
else
return treap_find(node->left,key);
}
int main(){
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
int x;
srand(time(0));
root=new treap;
nil=new treap;
nil->key=nil->priority=0;
nil->minim=nil->dif_minim=inf;
nil->maxim=-inf;
nil->left=nil->right=NULL;
root=nil;
while(scanf("%s",&op)!=EOF){
if(op[0]=='I'||op[0]=='C'||op[0]=='S'){
scanf("%d",&x);
if(op[0]=='I')
treap_insert(root,x,rand());
if(op[0]=='S'){
found=0;
treap_erase(root,x);
if(found==0)
printf("-1\n");
else
current--;
}
if(op[0]=='C')
printf("%d\n",treap_find(root,x));
}
if(op[0]=='M'&&op[2]=='N')
if(current<2)
printf("-1\n");
else
printf("%d\n",root->dif_minim);
if(op[0]=='M'&&op[2]=='X')
if(current<2)
printf("-1\n");
else
printf("%d\n",root->maxim-root->minim);
scanf("\n");
}
return 0;
}