Pagini recente » Cod sursa (job #1093634) | Cod sursa (job #2650072) | Cod sursa (job #382081) | Cod sursa (job #1854874) | Cod sursa (job #1525618)
#include<fstream>
#include<cstdlib>
#define inf 0x3f3f3f3f
using namespace std;
char op[20];
int current;
struct treap{
int key;
int priority;
int minim;
int maxim;
int dif_minim;
treap *left;
treap *right;
treap(int key,int priority,int minim,int maxim,int dif_minim,treap *left,treap *right){
this->key=key;
this->priority=priority;
this->minim=minim;
this->maxim=maxim;
this->dif_minim=dif_minim;
this->left=left;
this->right=right;
}
};
treap *root,*nil;
inline void update(treap *&node){
node->minim=min(node->key,node->left->minim);
node->maxim=max(node->key,node->right->maxim);
node->dif_minim=min(min(node->left->dif_minim,node->right->dif_minim),min(node->key-node->left->maxim,node->right->minim-node->key));
}
inline 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);
}
inline 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);
}
inline 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);
}
inline void treap_insert(treap *&node,int key){
if(node==nil){
node=new treap(key,rand(),key,key,inf,nil,nil);
current++;
return;
}
if(node->key==key)
return;
if(key<node->key)
treap_insert(node->left,key);
else
treap_insert(node->right,key);
balance(node);
}
inline void treap_erase(treap *&node,int key){
if(node==nil)
return;
if(key<node->key)
treap_erase(node->left,key);
else
if(key>node->key)
treap_erase(node->right,key);
else{
if(node->left==nil&&node->right==nil){
delete(node);
node=nil;
return;
}
if(node->left->priority>node->right->priority)
rotate_left(node);
else
rotate_right(node);
treap_erase(node,key);
}
if(node!=nil)
update(node);
}
inline 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->left,key);
else
return treap_find(node->right,key);
}
int main(){
ifstream f("zeap.in");
ofstream g("zeap.out");
int x;
nil=new treap(0,0,inf,-inf,inf,NULL,NULL);
root=nil;
current=0;
while(f>>op){
if(op[0]=='I'){
f>>x;
treap_insert(root,x);
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[1]=='A'&&op[2]=='X'){
if(current>=2)
g<<root->maxim-root->minim<<'\n';
else
g<<"-1\n";
}
else{
if(current>=2)
g<<root->dif_minim<<'\n';
else
g<<"-1\n";
}
}
return 0;
}