Pagini recente » Cod sursa (job #295367) | Cod sursa (job #2497502) | Cod sursa (job #1859974) | Cod sursa (job #966682) | Cod sursa (job #1525413)
#include<fstream>
#include<ctime>
#include<stdlib.h>
#define inf 2000000000
using namespace std;
char op[10],current=0;
struct treap{
int key;
int priority;
int minim;
int maxim;
int dif_minim;
treap *left;
treap *right;
treap(){
key=priority=0;
minim=dif_minim=inf;
maxim=-inf;
left=right=NULL;
}
};
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->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{
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(){
ifstream f("zeap.in");
ofstream g("zeap.out");
int x;
srand(time(0));
nil=new treap;
root=nil;
while(f>>op){
if(op[0]=='I'){
f>>x;
treap_insert(root,x,rand());
continue;
}
if(op[0]=='S'){
f>>x;
if(treap_find(root,x)==0){
g<<"-1\n";
continue;
}
treap_erase(root,x);
current--;
continue;
}
if(op[0]=='C'){
f>>x;
g<<treap_find(root,x)<<'\n';
continue;
}
if(op[0]=='M'&&op[2]=='N'){
if(current<2)
g<<"-1\n";
else
g<<root->dif_minim<<'\n';
continue;
}
if(op[0]=='M'&&op[2]=='X')
if(current<2)
g<<"-1\n";
else
g<<root->maxim-root->minim<<'\n';
}
return 0;
}