Pagini recente » Cod sursa (job #1306778) | Cod sursa (job #159576) | Cod sursa (job #2353081) | Cod sursa (job #399913) | Cod sursa (job #3269539)
#include <fstream>
using namespace std;
ifstream cin("zeap.in");
ofstream cout("zeap.out");
// asta e ok
int randomNum(){
return abs((rand()<<15)+rand())+1;
}
// asta e ok
struct treap{
int val,min1,max1,mind,priority;
treap *st,*dr;
treap(int val,treap *st,treap *dr){
this->val=this->min1=this->max1=val;
this->mind=1e9;
this->priority=randomNum();
this->st=st;this->dr=dr;
}
};
// asta e ok
treap *nill=new treap(0,nullptr,nullptr);
treap *root=nill;
// vine dinspre st catre dr
void rotatest(treap *&nod){
treap *aux=nod->st;
nod->st=aux->dr;
aux->dr=nod;
nod=aux;
}
// vine dinspre dr catre st
void rotatedr(treap *&nod){
treap *aux=nod->dr;
nod->dr=aux->st;
aux->st=nod;
nod=aux;
}
// asta e ok
void vf(treap *&nod){
if(nod==nill) return;
nod->min1=nod->max1=nod->val;
nod->mind=1e9;
if(nod->st!=nill){
nod->min1=nod->st->min1;
nod->mind=min(nod->mind,nod->st->mind);
nod->mind=min(nod->mind,nod->val-nod->st->max1);
}
if(nod->dr!=nill){
nod->max1=nod->dr->max1;
nod->mind=min(nod->mind,nod->dr->mind);
nod->mind=min(nod->mind,nod->dr->min1-nod->val);
}
}
// asta e ok
void balance(treap *&nod){
if(nod==nill) return ;
if(nod->priority<nod->st->priority) rotatest(nod);
if(nod->priority<nod->dr->priority) rotatedr(nod);
vf(nod->st);
vf(nod->dr);
vf(nod);
}
void insert(treap *&nod,int val){
if(nod==nill){
nod=new treap(val,nill,nill);
return ;
}
if(val<=nod->val){
insert(nod->st,val);
}else{
insert(nod->dr,val);
}
balance(nod);
}
bool find(treap *& nod,int val){
if(nod==nill) return 0;
if(nod->val==val) return 1;
if(val<nod->val){
return find(nod->st,val);
}else{
return find(nod->dr,val);
}
}
void erase(treap *&nod,int val){
if(val<nod->val){
erase(nod->st,val);
}else if(val>nod->val){
erase(nod->dr,val);
}else{
if(nod->st==nill && nod->dr==nill){
delete nod;
nod=nill;
return;
}
if(nod->st->priority<nod->dr->priority){
rotatedr(nod);
}else{
rotatest(nod);
}
erase(nod,val);
}
balance(nod);
}
int main()
{
nill->priority=0;
string s;
int a;
while(cin>>s){
if(s=="I"){
cin>>a;
if(!find(root,a)){
insert(root,a);
}
}else if(s=="S"){
cin>>a;
if(find(root,a)){
erase(root,a);
}else cout<<"-1\n";
}else if(s=="C"){
cin>>a;
cout<<find(root,a)<<"\n";
}else if(s=="MIN"){
if(root->mind==1e9) cout<<"-1\n";
else cout<<root->mind<<"\n";
}else{
if(root->mind==1e9) cout<<"-1\n";
else cout<<root->max1-root->min1<<"\n";
}
}
return 0;
}